bonjour,
pour simuler un autoincrement sous ORACLE j'utilise la technique du trigger couplé à une séquence.
j'ai créé une table comme suit (crée la table, la séquence et le trigger):
Dans mon code java, je mappe la table comme suit :
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 CREATE TABLE CLIENT ( CLIENT_ID INTEGER ,DATE_DERNIERE_CNX TIMESTAMP DEFAULT(SYSTIMESTAMP) ,CONNECTE SMALLINT NOT NULL ,NOM_HOST VARCHAR2(100) NOT NULL ,VERSION VARCHAR2(40) NOT NULL ,LOGIN VARCHAR2(40) NOT NULL ,PROFIL VARCHAR2(40) NOT NULL ,VERSION_OS VARCHAR2(40) NOT NULL ,LIGNE VARCHAR2(20) NOT NULL ,CONSTRAINT CLIENT_PK PRIMARY KEY (CLIENT_ID) )tablespace &tablespaces_donnees; CREATE UNIQUE INDEX CLIENT_IDX1 ON CLIENT(NOM_HOST ASC, LOGIN ASC); DROP SEQUENCE CLIENT_SEQUENCE; CREATE SEQUENCE CLIENT_SEQUENCE START WITH 1 INCREMENT BY 1 NOMAXVALUE; CREATE TRIGGER CLIENT_INSERT_TRIGGER BEFORE INSERT ON CLIENT FOR EACH ROW BEGIN SELECT CLIENT_SEQUENCE.nextval INTO :NEW.CLIENT_ID FROM DUAL; END;
lorsque j'utilise mon code java, du coup en base je me retrouve avec un id qui monte de 2 en 2 (2 4 6 8...) alors que dans mon code java lorsque je fais un getId() juste derrière le commit, je me retrouve avec les valeurs 1 3 5 7 ...
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 @Entity @Table(name="CLIENT", schema="ECLERGENERIQUE") public class Client implements Serializable{ /** * */ private static final long serialVersionUID = 2682913961805133813L; @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_CLIENT") @SequenceGenerator(name = "SEQ_CLIENT", sequenceName = "CLIENT_SEQUENCE", allocationSize = 1) @Column(name="CLIENT_ID", nullable=false, insertable = false, updatable = false) Long id; . . .
En gros, la persistence se passe bien, et le getId me renvoie la bonne valeur, sauf que du coup la base et le trigger ajoute systèmatiquement 1 à la valeur de l'identifiant...
Or j'ai absolument besoin de ce trigger car une autre appli (codée en C++) va venir insérer en base.
La question est : y a-til un moyen d'indiquer à hibernate que le mode de génération de la clé c'est un trigger plutôt que la séquence.
Merci pour l'aide.
Partager