IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

SEQUENCE Oracle IdentifierGenerator


Sujet :

Hibernate Java

  1. #1
    Membre du Club

    Profil pro
    Inscrit en
    Août 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 51
    Points : 46
    Points
    46
    Par défaut SEQUENCE Oracle IdentifierGenerator
    Bonjour à tous,

    j'utilise la stratégie SEQUENCE pour la génération des identifiants uniques. Pour cela, dans les fichiers de mapping je spécifie :

    <id name="utlId" type="big_decimal">
    <column name="UTL_ID" precision="22" scale="0" />
    <generator class="monpackage.TableNameSequenceGenerator" />
    </id>

    dans laquelle la classe TableNameSequenceGenerator réalise ceci :

    package monpackage;

    import java.util.Properties;

    import org.hibernate.MappingException;
    import org.hibernate.dialect.Dialect;
    import org.hibernate.id.PersistentIdentifierGenerator;
    import org.hibernate.id.SequenceGenerator;
    import org.hibernate.type.Type;

    public class TableNameSequenceGenerator extends SequenceGenerator {


    public static final String PREFIX = "SEQ_";

    /**
    * If the parameters do not contain a {@link SequenceGenerator#SEQUENCE} name, we
    * assign one based on the table name.
    */
    public void configure(Type type, Properties params, Dialect dialect) throws MappingException {
    if(params.getProperty(SEQUENCE) == null || params.getProperty(SEQUENCE).length() == 0) {
    String tableName = params.getProperty(PersistentIdentifierGenerator.TABLE);
    if(tableName != null) {
    String seqName = PREFIX + tableName;
    params.setProperty(SEQUENCE, seqName);
    }
    }
    super.configure(type, params, dialect);
    }
    }

    ceci permet de spécifier le nom de la sequence SEQ_Nom_DE_LA_TABLE se trouvant en base de données.

    Malheureusement, lorsque je souhaite effectuer un insert en base de données, j'obtiens l'exception suivante :

    org.springframework.orm.hibernate3.HibernateSystemException: this id generator generates long, integer, short or string; nested exception is org.hibernate.id.IdentifierGenerationException: this id generator generates long, integer, short or string
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:659)
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)
    at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:378)
    at org.springframework.orm.hibernate3.HibernateTemplate.saveOrUpdate(HibernateTemplate.java:693)
    at fr.edf.gri.persistence.hibernate.BaseDAOHibernate.saveObject(BaseDAOHibernate.java:39)
    at fr.edf.gri.daoTests.TUtilisateurDAOTests.testCreationUtilisateur(TUtilisateurDAOTests.java:101)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at junit.framework.TestCase.runTest(TestCase.java:154)
    at junit.framework.TestCase.runBare(TestCase.java:127)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:118)
    at junit.framework.TestSuite.runTest(TestSuite.java:208)
    at junit.framework.TestSuite.run(TestSuite.java:203)
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
    Caused by: org.hibernate.id.IdentifierGenerationException: this id generator generates long, integer, short or string
    at org.hibernate.id.IdentifierGeneratorFactory.get(IdentifierGeneratorFactory.java:59)
    at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:78)
    at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
    at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:495)

    La clé primaire de ma table est du type NUMBER (oracle).

    En base, la sequence est bien incrémentée, mais semble t-il, il y a un problème de correspondance de type hibernate oracle.

    Avez-vous une idée de comment résoudre ce problème.

    Merci

    jp

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Et si tu changes ton big_decimal en long ?

  3. #3
    Membre du Club

    Profil pro
    Inscrit en
    Août 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 51
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Et si tu changes ton big_decimal en long ?
    Le plus simple, effectivement, est de changer au niveau de la base le type NUMBER en INTEGER , d'ailleurs c'est plus logique. Sinon, il est possible d'implementer IdentifierGenerator.


    merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Equivalent Sequence Oracle en SQLServer
    Par Gabbe_pro dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 25/02/2010, 21h32
  2. pb appel sequence oracle
    Par etham dans le forum Oracle
    Réponses: 3
    Dernier message: 13/11/2006, 15h05
  3. Sequence Oracle : double incrémentation
    Par woodwai dans le forum Hibernate
    Réponses: 3
    Dernier message: 10/11/2006, 13h50
  4. genID pour sequence oracle
    Par COULON dans le forum XMLRAD
    Réponses: 4
    Dernier message: 11/04/2006, 11h54
  5. [EJB2.1 Entity] EJB Entite CMP et sequence Oracle
    Par kaiser2003 dans le forum Java EE
    Réponses: 5
    Dernier message: 11/03/2006, 10h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo