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

JPA Java Discussion :

mapper des ejb3.0 à une table oracle existante


Sujet :

JPA Java

  1. #21
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Bon j'ai essayé de faire avec le JoinTable


    dans mon entity USER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @OneToMany
    @JoinTable(
                name="JOIN",
                joinColumns = { @JoinColumn( name="user_id") },
                inverseJoinColumns = @JoinColumn( name="page_id")
        )
    public Collection<PAGE> getListe_PAGE() {
    	return liste_PAGE;
    }
    pas de collection dans JOIN pour les tests, et ma classe JOIN qui n'est pas une entity.

    J'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    09:52:13,099 ERROR [SchemaUpdate] Unsuccessful: alter table JOIN add constraint FKFD8FAB9D27D5EEFB foreign key (page_id) references PAGE
    09:52:13,099 ERROR [SchemaUpdate] ORA-02275: such a referential constraint already exists in the table
     
    09:52:13,139 ERROR [SchemaUpdate] Unsuccessful: alter table JOIN add constraint FKFD8FAB9D8233B843 foreign key (user_id) references USER
    09:52:13,139 ERROR [SchemaUpdate] ORA-02275: such a referential constraint already exists in the table
    Bon je ne peux pas modifier la BD...
    comment faire???

    Merci encore fr1man

  2. #22
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    après modifications ça déploie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @OneToMany(fetch = FetchType.EAGER)
    @JoinTable(
                name="JOIN"
                //,joinColumns = { @JoinColumn( name="user_id") },
                //inverseJoinColumns = @JoinColumn( name="page_id")
        )
    public Collection<PAGE> getListe_PAGE() {
    	return liste_PAGE;
    }


    2 println apres le .merge :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    10:12:58,277 INFO  [STDOUT] Enregistrement persisté (update) :10857098
    10:12:58,277 INFO  [STDOUT] Enregistrement persisté (update) :3
    10:12:58,457 WARN  [JDBCExceptionReporter] SQL Error: 1400, SQLState: 23000
    10:12:58,457 ERROR [JDBCExceptionReporter] ORA-01400: cannot insert NULL into ("JOIN"."USER_ID")
     
    10:12:58,457 ERROR [AbstractFlushingEventListener] Could not synchronize database state with session
    org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update

    du coup ct exactment l'erreur avec les ManyToMany du post de 9h30.


    sinon ma session bean est en stateless

    donc le merge passe, les println qui sont apres le merge passe, (le tout est dans un catch, pas d'exception levé...mais dans la BD ca ne persiste pas...puisque j'ai une erreur oracle




    Dans la doc hiberate :

    2.2.5.3.2.3. Relation unidirectionnel avec une table de jointure

    Une relation unidirectionnelle un à plusieurs avec une table de jointure est largement préférée. Cette association est décrite à travers l'annotation
    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
    @JoinTable.
     
    @Entity
    public class Trainer {
        @OneToMany
        @JoinTable(
                name="TrainedMonkeys",
                joinColumns = { @JoinColumn( name="trainer_id") },
                inverseJoinColumns = @JoinColumn( name="monkey_id")
        )
        public Set<Monkey> getTrainedMonkeys() {
        ...
    }
     
    @Entity
    public class Monkey {
        ... // pas de relation bidirectionnelle
    }

    Trainer décrit une relation unidirectionelle avec Monkey en utilisant la table de jointure TrainedMonkeys, avec une clef étrangère trainer_id vers Trainer (joinColumns) et une clef étrangère monkey_id vers Monkey (inversejoinColumns).
    c'est exactement ce que je veux, mais je n'arrive pas a persister...
    par rapport à l'exemple hibernate, si je fais un persit(trainer) en ayant modifier le Set<Monkey>, dans la table de jointure il ne veut pas me mettre l'id du trainerdans la table de jointure...

  3. #23
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    USER :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @ManyToMany(fetch = FetchType.EAGER,targetEntity = ejb.PAGE.class, cascade = CascadeType.ALL)
    @JoinTable(
                name="JOIN",
                joinColumns = { @JoinColumn( name="user_id") },
                inverseJoinColumns = @JoinColumn( name="page_id")
        )
    public Collection<PAGE> getListe_PAGE() {
    	return liste_PAGE;
    }
    PAGE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @ManyToMany(targetEntity=ejb.USER.class, mappedBy="liste_PAGE", cascade = CascadeType.ALL)
    	public Collection<USER> getListe_USER() {
    		return liste_USER;
    	}

    Perso ça me lève deux exceptions Oracle :

    ORA-02275: such a referential constraint already exists in the table

    sans incidence apparement..

    donc résolu car j'arrive bien et récupérer ma liste de page dans mon user
    et à persister mon user avec sa nouvelle collection de page., tout en mappant avec ma table JOIN qui n'est plus une entity

  4. #24
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Merci encore fr1man pour le lien cela m'a bien aider

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    De rien et bon courage pour la suite.

  6. #26
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Donc on a vu que cette méthode marchait..

    en fait dans ma table JOIN j'ai ceci (script)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ALTER TABLE JOIN ADD (
      CONSTRAINT FK_USER_ID FOREIGN KEY (USER_ID) 
        REFERENCES USER (ID)
        ON DELETE CASCADE);
     
    ALTER TABLE JOIN ADD (
      CONSTRAINT FK_PAGE_ID FOREIGN KEY (PAGE_ID) 
        REFERENCES PAGE (PAGE_ID));
    J'ai aussi donc mes tables PAGE et USER

    l'erreur précédente était qu'il me disait qu'il ne pouvait pas ajouter des cléfs étrangères car elles existaient déjà :

    avec le code précédent il essaye de rajouter des cléfs étrangères de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Unsuccessful: alter table PAGE add constraint FKFD8FAB9D27D5EEFB foreign key (PAGE_ID) references PAGE
    ERROR [SchemaUpdate] ORA-02275: such a referential constraint already exists in the table
    il essaye d'ajouter la cléf etrangère mais elle existe déjà et s'appelle FK_PAGE_ID, j'ai essayé les tags "referencedColumnName" mais il semble que ça n'a pas de rapport :p

    Donc si y'a un pro des TAGS EJB3.0, qui sait comment mapper le nom de la foreign KEY : (il me semble qu'avec hibernate, il y a plus de tags qu'en EJB3.0, donc si y'a qqun qui à la solution merci beaucoup)

    Merci

    [EDIT]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @ManyToMany(fetch = FetchType.EAGER,targetEntity = ejb.PAGE.class, cascade = CascadeType.ALL)
    	@JoinTable(
                name = "JOIN",
                joinColumns = { @JoinColumn( name = "USER_ID") },
                inverseJoinColumns = {@JoinColumn( name = "PAGE_ID") }
    D'après la doc sur les ejb3.0, c'est bien le champs name qui donne le nom de la FOREIGN KEY, mais cela ne marche pas : si je remplace par FK_USER_ID et FK_PAGE_ID, il va me créer des nouveaux champs dans ma table JOIN.

    D'ailleurs même si je donne USER_ID il mappe bien la colone, c'est juste le nom de la Foreign Key qu'il veut pas : "FKFD8FAB9D27D5EEFB". Ca sort d'où des noms comme ça??? moi je voudrais qu'il l'appelle FK_PAGE_ID

    (juste pour dire, au niveau BD Oracle je ne suis pas très au point...)

    [/EDIT]

  7. #27
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Voici une liste d'options de ce tag, je n'arrive pas à trouver où l'on peut spécifier le nom de la contraintes à une clef étrangère...

    j'ai déjà essayé de mixer les options avec les noms que je voulais et cela ne donne pas de bon résultat.

    ------------------------------------------------

    @JoinColumn()

    String name() :

    The name of the foreign key column.
    If the join is for a OneToOne or ManyToOne mapping,
    the foreign key column is in the table of the source entity.
    If the join is for a ManyToMany,
    the foreign key is in a join table.


    String referencedColumnName() :

    The name of the column referenced by this foreign key column.
    When used with relationship mappings,
    the referenced column is in the table of the target entity.
    When used inside a JoinTable annotation,
    the referenced key column is in the entity table of the owning entity,
    or inverse entity if the join is part of the inverse join definition.

    String columnDefinition() :
    The SQL fragment that is used
    when generating the DDL for the column.

    + d'autres options.

    Merci de votre aide.

  8. #28
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2003
    Messages : 12
    Par défaut
    Perso, je te conseille de toujours utiliser une appli qui génère des EJBs à partir de ta database, et de faire des modifs par la suite uniquement si c'est nécessaire. C'est une bonne façon de t'assurer que le mapping est correct à la base.

    Par exemple, avec Netbeans, une fois que tu as ajouté la datasource qui permet d'avoir accès à la database directement (si besoin, après avoir ajouté un driver dans les services), il suffit de faire un clic droit sur ton projet '*ejb' et choisir 'générer des entités à partir de la base de données'.

    Bonne chance!

Discussions similaires

  1. [Débutant] mapper des objets sur une table de sqlite
    Par fourchette dans le forum C#
    Réponses: 16
    Dernier message: 19/04/2012, 15h45
  2. Extraire des données d'une table Oracle à partir de Tomcat
    Par elekis dans le forum Tomcat et TomEE
    Réponses: 0
    Dernier message: 21/03/2012, 21h22
  3. Réponses: 2
    Dernier message: 22/10/2010, 17h14
  4. Réponses: 4
    Dernier message: 05/12/2007, 20h06
  5. format des dates d'une table déjà existante
    Par Gary_Stoupy dans le forum Access
    Réponses: 8
    Dernier message: 19/01/2007, 15h19

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