Bonjour, je suis en train de développer un Batch en JAVA qui utilise Hibernate (3) et Hibernate Annotation (3.2.0.GA). J'ai une base de données PostGre.
Lorsque je fais un INSERT j'utilise une séquence. Cette séquence est déjà entamé (j'ai dû faire la refonte d'une application déjà existante).
La séquence est à 42 et utilise une incrémentation +1. Pourtant à l'INSERT à l'aide de Hibernate l'Id généré est 2400 (environ) et à l'INSERT suivant il incrémente de 50.
Ma séquence :
Ma classe contenant l'objet à insérer dans la base :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE SEQUENCE ss_equipment_seq2 INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 47 CACHE 1; ALTER TABLE ss_equipment_seq2 OWNER TO stat_server;
Le bout de code qui permet l'insert :
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 @Entity @SequenceGenerator(name="equipment_seq", sequenceName="ss_equipment_seq2") @Table ( name="ss_equipment2", schema="public", uniqueConstraints = { @UniqueConstraint(columnNames={"eq_owner", "eq_name", "eq_ip"}), @UniqueConstraint(columnNames={"eq_owner", "eq_ownerid"}) } ) public class SsEquipment implements java.io.Serializable { public static Logger _log = LoggerManager.getInstance().getLogger(); private static final long serialVersionUID = 1L; @Id @Column(name="eq_id", unique=true, nullable=false) @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="equipment_seq") private int eqId; ... }
Et voici mon HibernateUtil :
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 public boolean insert () { // Ouverture de la transaction Transaction txn = HibernateUtil.currentSession().beginTransaction(); // Execution de la requête try { _log.debug(LogType.T_CONFIG,"Création de l'équipement : " + this.getId() + " - " + this.getEquipmentKey()); HibernateUtil.currentSession().save(this); } catch (Exception e) { _log.error(LogType.T_CONFIG, "Erreur lors de la création de l'équipement : " + e.getMessage()); return false; } finally { txn.commit(); } return true; }
J'ai fait exactement comme dans la documentation Hibernate Annotation et pourtant ça ne marche pas.
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 public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { // Crée la SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } catch (HibernateException ex) { throw new RuntimeException("Problème de configuration : " + ex.getMessage(), ex); } } public static final ThreadLocal<Session> session = new ThreadLocal<Session>(); public static Session currentSession() throws HibernateException { Session s = (Session) session.get(); // Ouvre une nouvelle Session, si ce Thread n'en a aucune if (s == null) { s = sessionFactory.openSession(); session.set(s); } return s; } public static void closeSession() throws HibernateException { Session s = (Session) session.get(); session.set(null); if (s != null) s.close(); } }
Merci d'avance
Partager