-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 
Author Message
 Post subject: SEQUENCE Oracle IdentifierGenerator
PostPosted: Fri Mar 21, 2008 6:45 am 
Newbie

Joined: Fri Mar 21, 2008 6:42 am
Posts: 6
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


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 21, 2008 6:57 am 
Beginner
Beginner

Joined: Thu Jan 31, 2008 6:35 am
Posts: 27
Desole, j'ai pas trop de temps de regarder, mais pourquoi tu n'utilises pas la config :
Code:
<id name="uid" column="X_UID">
<generator class="sequence">
  <param name="sequence">SEQ_NAME</param>
</generator>
</id>
Pour une sequence de base de données c'est plus simple. (et ca marche chez moi)


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 21, 2008 7:50 am 
Newbie

Joined: Fri Mar 21, 2008 6:42 am
Posts: 6
Bonjour,

en faisant :

<id name="utlId" type="big_decimal">
<column name="UTL_ID" precision="22" scale="0" />
<generator class="sequence">
<param name="sequence">SEQ_T_UTILISATEUR</param>
</generator>
</id>

ça ne fonctionne pas non plus. Est-ce que ca provient du type="big_decimal" ?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 21, 2008 8:32 am 
Beginner
Beginner

Joined: Thu Jan 31, 2008 6:35 am
Posts: 27
jpouille wrote:
Est-ce que ca provient du type="big_decimal" ?

C'est fort possible !
tu as le meme message d'erreur ? Si c'est le cas il est assez clair "this id generator generates long, integer, short or string"
Et la pas trop le choix, soit un long ca passe, soit faut passer en string mais la bonjour l'indexation :/

Pourquoi as tu besoin d'indiquer le type ? quel objet java, quel type sql utilises tu ?
Ta sequence de base retourne bien le bon type sql ?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 21, 2008 9:26 am 
Newbie

Joined: Fri Mar 21, 2008 6:42 am
Posts: 6
oui, j'ai le même message d'erreur.

En base la primary key est de type NUMBER.
Ce type équivaut au type big_decimal d'hibernate.
J'ai généré les fichier de mapping, automatiquement en utilisant Maven.

Faudrait-il que la primary key soit non pas NUMBER mais LONG.

C'est du Oracle 9i

merci pour votre aide

jp


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 21, 2008 10:09 am 
Beginner
Beginner

Joined: Thu Jan 31, 2008 6:35 am
Posts: 27
jpouille wrote:
Faudrait-il que la primary key soit non pas NUMBER mais LONG.

Si tu peux le faire, oui il faut le tester ;)
Ca risque de mieux marcher.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 21, 2008 12:06 pm 
Newbie

Joined: Fri Mar 21, 2008 6:42 am
Posts: 6
avec INTEGER par exemple ca fonctionne. D'ailleurs c'est plus logique.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.