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

Java EE Discussion :

[Oracle] auto-increment


Sujet :

Java EE

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 37
    Points : 26
    Points
    26
    Par défaut [Oracle] auto-increment
    moi je travail avec les EJBs (de type CMP), pour insérer un enregistrement ds une table j'appel la fonction create(je mets lici les paramétres + identificateur)
    sachant qu'il y'as pas le type auto-increment en oracle
    comment je peut faire pour éviter de passer le paramétre identificateur ds la liste des paramétres de la fonction create

    et merci d'avance

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Points : 111
    Points
    111
    Par défaut
    Il n'y a pas d'auto_increment mais il y a les séquences pour remplacer cette fonction.

    D'abord tu créer ta séquence.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CREATE SEQUENCE seqIdTable MINVALUE 0 INCREMENT BY 1
    Et ensuite dans table tu l'appelles ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO table VALUES (seqIdTable.nextval,'champ1','cham2....
    nextval incrémente a chaque fois ta séquence, la valeur courante de ta séquence peut être récupérer grace a seqIdTable.curval (ou currval je sais plus).

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Une question m'interpele en lisant ton post.

    Comment partager la table qu'a créer l'entityBean en BD avec une application JDBC ?
    J'obtiens des violations de contraintes d'unicité, si j'utilise les séquences depuis un client JDBC, et qu'ensuite je passe par mon ejb pour ajouter un autre Objet.

    Comment synchroniser l'entityManger avec la sequence qui a été modifier en BD ?

    Je vois remercie de toutes réponses/remarques constructives.

  4. #4
    Membre émérite
    Avatar de alexismp
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 503
    Points : 2 777
    Points
    2 777
    Par défaut
    Quel bonheur d'être passé aux EJB 3! :-)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @Entity
    public class MonEJB {
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
        ...
    }

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Le type AUTOGENERE c'est bien mais....

    Imagine que tu es une table qui soit partagée avec une autre application mais en JDBC.

    1\ Ton application en JDBC fait un INSERT ayant pour clé primaire 1.
    2\ Ton EJB fait un persist juste aprés, l'auto génération va généré une clé primaire égale à 1.

    Et là ... c'est le drame , violation de clé primaire.

    Comment faire en sorte que l'auto génération de la clé en EJB puisse se rafraichir pour ne pas avoir de violation clé primaire ??

    Merci.

  6. #6
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Euh je ne vois pas trop le probleme des clés de sequence ?!?

    Si ton application JDBC veut ajouter un élément : elle ira chercher la séquence et obitendra 10 par exemple.
    Juste après, ton entityManager veut persister un objet, il ira chercher une autre séquence et obtiendra 11 ... où est donc le problème ?
    Si il va persister l'objet avec ID 10, soit il faudra le précharger pour qu'il soit reconnu comme existant en base, soit il comprendra, en voyant l'ID que ce dernier existe déjà en base non ?!? Donc pas d'insert, donc aucune violation de contrainte selon moi
    See you, space cowboy... and if you're satisfied, click on

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Euh je ne vois pas trop le probleme des clés de sequence ?!?
    Pour les séquences effectivement, pas de problème (si le client JDBC utilise la séquence).

    Mais concernant la génération de clé primaire automatique avec les entity Bean ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @GeneratedValue(strategy = GenerationType.AUTO)
    si j'ai un objet (ajouté par EJB) ayant un id=10 en bd et que j'en rajoute un en JDBC avec l'id = 11.

    Mon prochain ajout par EJB va généré une clé primaire ayant pour valeur 11.

    c'est la que ca coince...

    Comment rafraichir / resynchroniser mon appli EJB pour ne pas avoir ce genre de probleme ? recharger un entitymanager ?

    Avez-vous des solutions ?

    Merci.

  8. #8
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Ah ok, le auto signifie que c'est l'EJB qui va autogéré l'identifiant ... mais qui nous dit qu'il ne consultera justement pas en base pour connaitre si il existe un autoincrement ou une sequence justement ?!?
    See you, space cowboy... and if you're satisfied, click on

  9. #9
    Futur Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    lol , je l'ai essayé !!

    Je poserais pas la question sinon .

    Essaie et on verra si tu as le même problème que moi.

    On attends de tes nnouvelles.

  10. #10
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Ah bah non je ne vais pas essayé, je n'ai jamais développé en EJB, alors EJB3 .... on attendra

    Mais je te crois hein, c'est juste que, comme tu n'as jamais précisé que tu avais essayé, moi je posais la question
    See you, space cowboy... and if you're satisfied, click on

  11. #11
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    Avec EJB3, il est possible de préciser une séquence comme générateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        @Id
        @SequenceGenerator(name = "mySeq", sequenceName = "mySeqName")
        @GeneratedValue(generator = "mySeq")
        @Column(name = "ID_COL")
        private long id;
    Et le tour est joué. De toute manière, il vaut mieux que toutes les applis utilisent le même générateur de clés pour éviter de fare sauter les contraintes d'unicité.
    Pour Oracle, le mieux c'est bien sûr la séquence...

    PS : Je ne peux pas me prononcer pour EJB2. Le mécanisme de EJB3 existe bien sûr dans Hibernate, et il me semble aussi dans JDO (à vérifier).
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

Discussions similaires

  1. Talend oracle auto increment
    Par cedric774 dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 21/02/2013, 11h16
  2. Auto increment sur Oracle
    Par intissar_g dans le forum SQL
    Réponses: 3
    Dernier message: 30/09/2008, 15h06
  3. [Oracle 10g] Auto Increment
    Par cnguyen dans le forum Oracle
    Réponses: 15
    Dernier message: 04/07/2006, 12h13
  4. [oracle 9i] auto-increment
    Par jamal_b dans le forum Oracle
    Réponses: 15
    Dernier message: 10/04/2006, 17h19
  5. auto incremente + ORACLE?? (intégré à la FAQ)
    Par oceane751 dans le forum Oracle
    Réponses: 4
    Dernier message: 20/01/2006, 17h18

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