Bonjour à tous !
Je me permets de vous faire part du problème qui me fait tourner en rond depuis quelques heures déjà. Je ne suis pas certain de son origine, entre Hibernate ou bien le SGBD utilisé (H2). Désolé par avance si ça n'est pas lié à Hibernate.
A priori, il s'agit de la méthode session.save(monObjet) qui génère une exception. L'identifiant généré est null, et de fait, à l'insertion, mon SGBD n'est pas content.
Ce que je ne comprends pas, c'est que normalement, c'est cette méthode qui est censée gérer l'attribution de la clé (à l'aide du generator défini dans le fichier de mapping). J'ai essayé différents generators, mais avec le même succès.
Ci-dessous les informations relatives à mon problème.
Merci d'avance !
Versions des librairies utilisées :
Hibernate - 3.3.2.GA
H2 : 1.2.125 (essayé également avec la dernière stable, 1.1.118)
Classe Personne.java
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 public class Personne { private int idPersonne; private String prenom; private String nom; private int age; public Personne() { } public int getIdPersonne() { return idPersonne; } public void setIdPersonne(int idPersonne) { this.idPersonne = idPersonne; } public String getPrenom() { return prenom; } public void setPrenom(String prenom) { this.prenom = prenom; } public String getNom() { return nom; } public void setNom(String nom) { this.nom = nom; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Fichier de mapping :
Le fichier hibernate.cfg.xml : il ne contient rien de particulier - l'accès à la base (qui fonctionne), avec driver & dialecte, la propriété current_session_context_class avec la valeur thread, ainsi que la déclaration du fichier de mapping.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Personne" table="Personne"> <id column="id_personne" name="idPersonne" type="int"> <generator class="native" /> </id> <property column="prenom" name="prenom" type="string"/> <property column="nom" name="nom" type="string"/> <property column="age" name="age" type="int"/> </class> </hibernate-mapping>
Le main :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public class HibernateMain { public static void main(String[] args) { Personne p = new Personne(); p.setAge(1); p.setNom("Subject #1"); p.setPrenom("Test"); try{ Session session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); session.save(p); session.getTransaction().commit(); } catch (HibernateException e) { e.printStackTrace(); }
Et la pile d'exception :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 ATTENTION: SQL Error: 90006, SQLState: 90006 14 déc. 2009 16:32:27 org.hibernate.util.JDBCExceptionReporter logExceptions GRAVE: NULL not allowed for column "ID_PERSONNE"; SQL statement: insert into Personne (id_personne, prenom, nom, age) values (null, ?, ?, ?) [90006-124] org.hibernate.exception.GenericJDBCException: could not insert: [fr.insee.tuto_hibernate.model.Personne] at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126) at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2176) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2656) at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:563) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:551) at org.hibernate.impl.SessionImpl.save(SessionImpl.java:547) 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:585) at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:342) at $Proxy0.save(Unknown Source) at fr.insee.tuto_hibernate.main.HibernateMain.main(HibernateMain.java:42) Caused by: org.h2.jdbc.JdbcSQLException: NULL not allowed for column "ID_PERSONNE"; SQL statement: insert into Personne (id_personne, prenom, nom, age) values (null, ?, ?, ?) [90006-124] at org.h2.message.Message.getSQLException(Message.java:111) at org.h2.message.Message.getSQLException(Message.java:122) at org.h2.message.Message.getSQLException(Message.java:75) at org.h2.table.Column.validateConvertUpdateSequence(Column.java:296) at org.h2.table.Table.validateConvertUpdateSequence(Table.java:599) at org.h2.command.dml.Insert.insertRows(Insert.java:116) at org.h2.command.dml.Insert.update(Insert.java:82) at org.h2.command.CommandContainer.update(CommandContainer.java:72) at org.h2.command.Command.executeUpdate(Command.java:209) at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:139) at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:128) at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57) ... 22 more
Partager