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 :

ORACLE TRIGGER ID AUTOINCREMENT


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 34
    Par défaut ORACLE TRIGGER ID AUTOINCREMENT
    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):
    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;
    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
     
    @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;
    .
    .
    .
    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 ...

    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.

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    C'est un peu spécial ce que tu essaies de faire.
    Pour ma part, j'aurais viré ton trigger et gardé ta séquence.
    Comme ça tout va bien coté java.
    Côté c++, j'aurais utilisé la séquence pour insérer de nouveaux enregistrements.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Par défaut
    Hum le comportement se comprend, tu demandes à hibernate de gérer lui même la sequence, il va donc faire un select sequence.next avant d'inserer (+1), et ensuite le trigger va ignoré l'id lors de l'insert et faire un second select sequence.next (+2).

    Tu as essayé en supprimant les annotations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_CLIENT")
    	@SequenceGenerator(name = "SEQ_CLIENT", sequenceName = "CLIENT_SEQUENCE", allocationSize = 1)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 34
    Par défaut
    J'ai essayé en effet en supprimant les annotations et cela ne fonctionne toujours pas. Tant pis je crois que je vais me résoudre à supprimer le trigger.

    merci pour les réponses

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

Discussions similaires

  1. ORACLE TRIGGER AIDEZ MOI SVT
    Par roulietta59 dans le forum PL/SQL
    Réponses: 0
    Dernier message: 17/12/2009, 17h28
  2. probleme oracle trigger
    Par D.Mounir dans le forum Oracle
    Réponses: 2
    Dernier message: 11/09/2007, 12h56
  3. Oracle - Trigger et Code Java
    Par cdryk dans le forum PL/SQL
    Réponses: 3
    Dernier message: 03/03/2006, 15h17
  4. Réponses: 4
    Dernier message: 18/10/2004, 16h18
  5. [Syntaxe Oracle/Sybase] désactiver un trigger
    Par MashiMaro dans le forum Sybase
    Réponses: 3
    Dernier message: 30/10/2003, 11h17

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