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. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut mapper des ejb3.0 à une table oracle existante
    Bonjour j'ai un petit problème pour mapper des entities bean à des tables d'une base existante.

    ///////
    j'ai 2 tables :

    USER
    id (pk)
    ...

    et

    PAGE
    page_id (pk)
    ...

    et dans ma base existante j'ai une table de jointure :

    JOIN
    user_id (pk1)
    page_id (pk2)

    /////////

    voilà normalement j'aurais fait si l'a base était inexistante, les mêmes tables mais avec un ID pour lable join

    j'ai developpé des ejb3.0 entities ayant comme champs les memes noms,

    puis pour la table de jointure :

    ...
    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
    @Id
    @Column(name="PAGE_ID", unique=false)
    public double getPage_id() {
    		return page_id;
    }
     
     
    public void setPage_id(double form_id) {
    		this.page_id = form_id;
    }
     
     
     
    @Id
    @Column(name="USER_ID", unique=false)
    public String getUser_id() {
    		return user_id;
    }
    ...


    voilà déjà le problème c que comme ça je ne peux pas rajouter par exemple :

    un objet JOIN ayant un USER_ID existant..
    dans la BD actuelle ce champs n'est pas unique, du moins les données.

    exemple :
    USER_ID PAGE_ID
    fd174 17
    fd174 15
    fd175 17
    fd175 18

    c une table qui pour un utilisateur donnée le lie à une page.

    j'appelle :
    une méthode qui va rajouter une Collection<JOIN>
    contenant les valeurs suivantes :

    USER_ID PAGE_ID
    10857098 -4
    10857098 -3


    voilà j'ai une exception avec le code ci dessus :

    15:35:29,776 INFO [STDOUT] Enregistrement persisté :10857098; -4.0
    15:35:29,786 INFO [STDOUT] ERREUR SQL : javax.persistence.PersistenceException: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [ejb.JOIN#10857098]

    donc il me dit que l'identifiant n'est pas unique...mais bon je sais que normalement dans une entity il faut un identifiant pour l'entity, mais je ne peux pas modifier ma classe.

    J'ai essayer un autre moyen sans la l'entity JOIN, mais en utilisant des

    dans USER
    Collection<PAGE>
    et dans PAGE
    Collection<USER>

    avec sur les getters.setters des relations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @OneToMany(mappedBy = "ID")
    @JoinColumn(table ="PT_JOIN", name="USER_ID", nullable=false, updatable=true)
    [EDIT]
    normalement c des ManyToMany,.mais bon c'est la même erreur...
    [/EDIT]

    idem dans l'autre avec les bons champs, il me sort une exception de clef etrangères..mais jene sais pas si c'est dans la base ou dans l'entity


    15:52:36,444 INFO [EntityBinder] Bind entity ejb.USER on table USER
    15:52:36,484 WARN [ServiceController] Problem starting service persistence.units:jar=EJB.jar,unitName=MABASE
    org.hibernate.cfg.NotYetImplementedException: Collections having FK in secondary table


    C'est peut etre pas la bonne méthode, donc si quelqu'un à une solution..

    Merci

  2. #2
    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
    Essaie 2 @ManyToMany, si ta table d'association ne contient que les 2 clefs étrangères.
    Si tu as d'autres données dans cette table, il faudra faire 2 one-to-many.

  3. #3
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    merci je vais essayer

  4. #4
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    dans les deux entities : USER et PAGE

    dans USER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @ManyToMany(mappedBy = "PAGE_ID")
    	@JoinColumn(table ="JOIN", name="PAGE_ID", nullable=false, updatable=true)
    	public Collection<PAGE> getListe_PAGE() {
    		return liste_PAGE;
    	}
    dans PAGE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @ManyToMany(mappedBy = "ID")
    	@JoinColumn(table ="JOIN", name="USER_ID", nullable=false, updatable=true)
    	public Collection<USER> getListe_USER() {
    		return liste_USER;
    	}
    l'entity JOIN, n'étant plus une entity...(enlevé le tag @Entity)


    dèjà le BIND est okay, mais :

    16:23:01,536 WARN [ServiceController] Problem starting service persistence.units:jar=EJB.jar,unitName=MABASE
    org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: ejb.PAGE.PAEG_ID in ejb.USER.liste_PAGE

    voila merci encore fr1man

  5. #5
    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
    sur cette ligne :
    entity property: ejb.PAGE.PAEG_ID in ejb.USER.liste_PAGE
    c'est normal, le "PAEG_ID" ?

  6. #6
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    non j'ai juste mal ecrit quand j'ai fait un copier coller car les nom sont assez long, ct pour reduire un peu :p

    donc c bien :

    16:23:01,536 WARN [ServiceController] Problem starting service persistence.units:jar=EJB.jar,unitName=MABASE
    org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: ejb.PAGE.PAGE_ID in ejb.USER.liste_PAGE

  7. #7
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Bon déjà toutes mes excuses,

    j'avais mapper sur le nom de la colonne de la table et non de l'entity

    en fait le mapping de USER passe apparement
    car j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @ManyToMany(mappedBy = "id")
    	@JoinColumn(table ="JOIN", name="USER_ID", nullable=false, updatable=true)
    	public Collection<USER> getListe_USER() {
    		return liste_USER;
    	}
    mais avec mon entity PAGE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @ManyToMany(mappedBy = "page_id")
    	@JoinColumn(table ="JOIN", name="PAGE_ID", nullable=false, updatable=true)
    	public Collection<PAGE> getListe_PAGE() {
    		return liste_PAGE;
    	}
    17:04:25,147 WARN [ServiceController] Problem starting service persistence.units:jar=EJB.jar,unitName=MABASE
    javax.persistence.PersistenceException: org.hibernate.MappingException: Repeated column in mapping for collection: ejb.USER.liste_PAGE column: page_id

  8. #8
    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
    C'est pas le contraire qu'il faudrait faire ?
    Dans User, tu aurais une liste de Page et dans Page, une liste de User ?

  9. #9
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Citation Envoyé par fr1man
    C'est pas le contraire qu'il faudrait faire ?
    Dans User, tu aurais une liste de Page et dans Page, une liste de User ?


    oui pardon c'est le cas, c'est juste que me suis gourré en redigeant, donc

    PAGE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @ManyToMany(mappedBy = "id")
    @JoinColumn(table ="JOIN", name="USER_ID", nullable=false, updatable=true)
    public Collection<USER> getListe_USER() {
    return liste_USER;
    }
    USER :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @ManyToMany(mappedBy = "page_id")
    @JoinColumn(table ="JOIN", name="PAGE_ID", nullable=false, updatable=true)
    public Collection<PAGE> getListe_PAGE() {
    return liste_PAGE;
    }
    17:04:25,147 WARN [ServiceController] Problem starting service persistence.units:jar=EJB.jar,unitName=MABASE
    javax.persistence.PersistenceException: org.hibernate.MappingException: Repeated column in mapping for collection: ejb.USER.liste_PAGE column: page_id



    mais donc apparement c'est un problème avec mes 2 tags :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @ManyToMany(mappedBy = "page_id")
    @JoinColumn(table ="JOIN", name="PAGE_ID", nullable=false, updatable=true)
    je vais essayer sans le name="PAGE_ID" on verra bien

    merci encore fr1man

  10. #10
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Bon apparement même sans le

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @ManyToMany(mappedBy = "page_id")
    @JoinColumn(table ="JOIN", nullable=false, updatable=true)
    public Collection<PAGE> getListe_PAGE() {
    return liste_PAGE;
    }
    J'ai la meme erreur donc c pas ça...bon je verrai ça demain, en espérant que tu seras là pour m'aider



    merci encore

  11. #11
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 61
    Par défaut
    j'utilise jdeveloper et voici un example de mon code :

    @ManyToOne

    @JoinColumn(name="CONSERNE",referencedColumnName="MATRICULE",insertable=false, updatable=false)

    private RecTPersonnel consernepers;

    public RecTPersonnel getConsernepers(){
    return (RecTPersonnel) this.consernepers;
    }
    public void setConsernepers(RecTPersonnel pers){
    this.consernepers=pers;
    }

    c'est une jointure entre deux tables

  12. #12
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Merci chakala.

    J'ai en fait contourner le probleme en gardant mon entity JOIN,

    au lieu de faire un persist de chaque objet dont l'erreur etait un duplicata de l'ID quand j'insérais :

    123 12
    123 13
    (je rappelle que je ne peux pas toucher à la BD (table, champs, clef...)

    donc au lieu de faire un persist, je triche un peu...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    query = "insert into JOIN (user_id, page_id) " +
    				"values ('"
    			+ a_JOIN.getUser_id() + "', " 
    			+ a_JOIN.getPage_id() + ")";
    				System.out.println(query);
    // createQuery ne marche pas, réservé à l'EJBQL apparement on peut pas faire d' INSERT INTO VALUES				
    //manager.createQuery(query);
    //createNativeQuery marche parfaitement et mes objets JOIN sont bien persisté.
     
    manager.createNativeQuery(query).executeUpdate();

    voilà comment contourner le problème, (c'est pas un exemple à prendre car généralement on ne s'occupe plus de la BD en EJB3.0 + JBOSS, car on peut persister sur n'importe quel SGBD...
    voilà, la petite bidouille pour les BDs existantes...

    Chakala je met ton idée sous le coude et je remettrai un message pour dire si ça marche plus tard... Merci encore à toi et à fr1man

  13. #13
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 61
    Par défaut
    de rien pour faire la mise a jour il faut mettre le false a true.

    moi je le fais personnelement , si tu veux de docs je peux vous envoyer sur EJB

    bon chance

  14. #14
    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
    Si ça marche c'est déjà ça.

    Es-tu certain qu'il faille déclarer un @JoinColumn des deux cotés de la relation ?

  15. #15
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Bon en fait avec ma methode j'ai un autre problème c'est plutot mon EJB entity JOIN

    dans ma BD JOIN

    USER_ID PAGE_ID
    123 10
    123 12
    123 13
    123 20
    123 30
    123 40
    123 50
    255 5
    255 10
    255 15

    lorsque je recupère la collection<JOIN>

    avec une commande EJBQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Collection<JOIN>)manager.createQuery("from JOIN").getResultList();
    En gros si j'affiche les objets..

    j'ai
    123 0
    123 0
    123 0
    123 0
    123 0
    123 0
    123 0
    255 0
    255 0
    255 0



    dans mon entity JOIN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Id
    @Column(name="USER_ID", unique=false)
    public String getUser_id() {
    	return user_id;
    }
     
     
    @Id	
    @Column(name="PAGE_ID", unique=false)
    public double getPage_id() {
    	return page_id;
    }


    par contre si j'enleve les tags :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //@Id	
    //@Column(name="PAGE_ID", unique=false)
    public double getPage_id() {
    	return page_id;
    }
    J'ai bien des valeurs, mais elles sont bizarres...


    123 10
    123 10
    123 10
    123 10
    123 10
    123 10
    123 10
    255 5
    255 5
    255 5

    il me retourne bien le bon nombre d'enregistrement, mais pas le bon champs page_ID, il dupplique le champs du premier enregistrement..

    J'aimerai trouver la liste des tags en ejb3.0, mais je ne sais pas, j'ai déjà les 3 PDF de SUN sur les Entreprises JAVABeans, mais ce n'est pas assez détaillé..., y'a pas tout les options des tags....

    Donc si qq'un avait ça sous la main ou avait la solution pour les tags de mon entity ça serait sympa, merci

  16. #16
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    avec des relation ManyToOne, le problème c'est que cela ne génère pas de table de jointure, or, je doit générer une structure EJB3.0 qui colle à la BD actuelle.

    normalement une relation ManyToOne c pas une autre sorte de jointure?


    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //
    @Entity 
    public class Categorie implements java.io.Serializable
    {
    String idCategorie ;
    Collection<Type> listeType;
    }
     
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "uneCategorie")
    public Collection<Type> getListeType() {
    	return listeType;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ////
    @Entity 
    public class Type implements java.io.Serializable
    {
    String idType;
    Catégorie uneCategorie;
    }
     
    @ManyToOne @JoinColumn(name = "idCategorie") 
    public Categorie getUneCategorie()
    {
    	return uneCategorie;
    }

    enfin j''utilise la relation ManyToOne de cette manière en fait, du coup quand on supprime une catégorie, cela supprime tous les types associés, (grace au cascade = CascadeType.ALL)

    Dans mon cas en fait il me faut une collection dans mes 2 entities

    c pour cela que j'utilisais des OneToMany, voir des ManyToMany,

    avec les ManyToMany, normalement il génère les tables de jointure..ce qu'il me faut, mais apparement j'ai des problème de syntaxe encore, et il me faudrait les bon tags pour faire lemapping à la BD existante, si il n'y avait aps cette BD, il creerait les tables automatiquement...

    enfin merci pour vos aides :p

  17. #17
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    donc apres quelques modifs :


    dans USER :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @ManyToMany(mappedBy = "PAGE_ID")
    @JoinColumn(table ="JOIN", name="PAGE_ID", nullable=false, updatable=true)
    public Collection<PAGE> getListe_PAGE() {
    return liste_PAGE;
    }
    dans PAGE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @ManyToMany
    @JoinColumn(table ="JOIN", name="USER_ID", nullable=false, updatable=true)
    public Collection<USER> getListe_USER() {
    return liste_USER;
    }
    J'ai virer les (mappedBy = "PAGE_ID")..

    le projet se deploie, mais bon il essaye donc de me creer les table de jointure, qu'il nomme automatiquement :
    PAGE_USER et USER_PAGE

    je voudrais donc mapper ces tables avec ma table JOIN..., comment faire..

    le @JoinColumn(table ="JOIN", name="USER_ID", nullable=false, updatable=true)
    ne semble pas être prise en compte

    Merci

    p.s :merci pour les balises :p

  18. #18
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Bon je viens de comprendre...

    Mais bon je testerai après le long week....


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //
    @Entity 
    public class Categorie implements java.io.Serializable
    {
    String idCategorie ;
    Collection<Type> listeType;
    }
     
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "uneCategorie")
    public Collection<Type> getListeType() {
    	return listeType;
    }
    je vais essayé de mettre deux relations :
    @OneToMany()
    dans mon entity JOIN
    pour mes deux champs,...mais bon je ne pense pas que cela marchera, car je n'ai pas d'identifiant unique dans ma table, JOIN...

    enfin bon sinon bon week end à tous

  19. #19
    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
    C'est pas plutôt @JoinTable qu'il faut utiliser ?
    Va voir là au chapitre 2.2.5.3.3.1
    http://www.hibernate.org/hib_docs/an...r/html_single/

    Si je ne dis pas de connerie, Hibernate étant une implémentation des EJB3, cette doc là doit être valable, à part sans doute quelques particularités.

  20. #20
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 34
    Par défaut
    Merci pour le lien, j'ai essaye de faire des ManyToMany, cela mappe bien sur les tables... en faisant un lazy pour une table et un eager pour l'autre

    chaque table contenant une collection de l'autre,

    le probleme c'est lors de la persistance, quand je fais mon merge ou mon persist
    il me sort une erreur genre
    couldn't insert nullvalues in table .."ma table de jointure"...

    alors que je fais un merge ou persist en modifiant ma collection de l'une des tables, l'erreur survient dans le merge ou le persist : erreur SQL

    je vais essayer autre chose...

    merci encore et d"solé pour le retard

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