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 :

[JPA] [EJB3] - Mapping et @ManyToOne erreur


Sujet :

JPA Java

  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut [JPA] [EJB3] - Mapping et @ManyToOne erreur
    Salut,

    J'obtiens cette erreur lors de la génération de mon EAR:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Reason: org.hibernate.AnnotationException: @OneToOne or @ManyToOne on ejb.product.ProductBean.store references an unknown entity: ejb.store.Store
    Si je supprime la classe ProductBean (avec Product), tout se passe bien, et les Stores fonctionnent.

    Voici le code de cette classe :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    @Entity
    public class ProductBean implements Product, Serializable {
     
        private static final long serialVersionUID = 1L;
     
        @Id
        @GeneratedValue
        private int id;
     
        private String name;
        private int price;
        @ManyToOne
        private Store store;
        private String description;
     
        public ProductBean() {}
     
        public ProductBean(String name, int price, Store store, String description) {
            this.name = name;
            this.price = price;
            this.store = store;
            this.description = description;
        }
     
        public String getDescription() {
            return description;
        }
     
        public String getName() {
            return name;
        }
     
        public int getPrice() {
            return price;
        }
     
        public int getId() {
            return id;
        }
     
        public Store getStore() {
            return store;
        }
     
        public void setDescription(String description) {
            this.description = description;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
        public void setPrice(int price) {
            this.price = price;
        }
     
        public void setStore(Store store) {
            this.store = store;
        }
     
    }
    Si je vire @OneToMany, j'ai un MappingException...

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    Tu dois spécifé dans la relation le Join

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @JoinColumn(name = "ref_store", referencedColumnName = "id_store")
    @ManyToOne
    private Store store;

    ou ref_store représente le nom du champ qui fait office de foreign key dans ta table et id_store le champ référencé

  3. #3
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Et ton entity bean Store a quelle forme ? L'erreur ne viendrait pas de lui ?

  4. #4
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par *alexandre*
    Tu dois spécifé dans la relation le Join

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @JoinColumn(name = "ref_store", referencedColumnName = "id_store")
    @ManyToOne
    private Store store;

    ou ref_store représente le nom du champ qui fait office de foreign key dans ta table et id_store le champ référencé
    Normalement le @ManyToOne ne gère pas ça automatiquement si on ne précise pas la jointure?

    J'ai essayé de mettre cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @JoinColumn(name = "store", referencedColumnName = "id")
    ça ne change rien...

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Claythest
    Et ton entity bean Store a quelle forme ? L'erreur ne viendrait pas de lui ?
    Je ne pense pas, car si je vire Product, Store fonctionne bien

    voici qd mm le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Local
    public interface Store {
     
        int getId();
        String getName();
        void setName(String name);
        String getCityName();
        void setCityName(String cityName);
        String getDescription();
        void setDescription(String description);
        String getImageURL();
        void setImageURL(String imageURL);
     
    }
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    @Entity
    public class StoreBean implements Store, Serializable {
     
        private static final long serialVersionUID = 1L;
     
        @Id
        @GeneratedValue
        private int id;
     
        private String name;
        private String cityName;
        private String description;
        private String imageURL;
     
        public StoreBean() {}
     
        public StoreBean(String name, String cityName, String description, String imageURL) {
            this.name = name;
            this.cityName = cityName;
            this.description = description;
            this.imageURL = imageURL;
        }
     
        public String getCityName() {
            return cityName;
        }
     
        public String getDescription() {
            return description;
        }
     
        public String getName() {
            return name;
        }
     
        public int getId() {
            return id;
        }
     
        public String getImageURL() {
            return imageURL;
        }
     
        public void setImageURL(String imageURL) {
            this.imageURL = imageURL;
        }
     
        public void setCityName(String cityName) {
            this.cityName = cityName;
        }
     
        public void setDescription(String description) {
            this.description = description;
        }
     
        public void setName(String name) {
            this.name = name;
        }
     
    }

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    Citation Envoyé par ®om
    Normalement le @ManyToOne ne gère pas ça automatiquement si on ne précise pas la jointure?
    J'ai un gros doute la dessus. Tu fais référence sur Store et non sur l'entity peut être que ca vient de la.

    Je comprend pas vraiment pourquoi tu définis une interface pour chacune de tes entités.

  7. #7
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par *alexandre*
    Je comprend pas vraiment pourquoi tu définis une interface pour chacune de tes entités.
    Parce que sinon ça ne peut pas marcher en RMI... (ou alors je ne vois pas comment). Sur tous les tutos EJB3 ils font toujours une interface...

    Cependant, merci, le problème venait bien du fait que je référençais store, et donc il fallait préciser dans l'annotation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @ManyToOne(targetEntity=StoreBean.class)
    Si quelqu'un a une autre méthode, je serais intéressé aussi (pour n'écrire que @ManyToOne sans attribut, j'essaie d'utiliser tout le temps les valeurs par défaut.

  8. #8
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Maintenant une autre question, si dans Product j'ai une référence vers Store, et que dans Store j'ai une référence vers une List<Product>, je vais utiliser d'un côté @ManyToOne et de l'autre côté @OneToMany, mais comment lui faire comprendre que c'est bien la même relation et non deux différentes?

  9. #9
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    Citation Envoyé par ®om
    Parce que sinon ça ne peut pas marcher en RMI... (ou alors je ne vois pas comment). Sur tous les tutos EJB3 ils font toujours une interface...

    Cependant, merci, le problème venait bien du fait que je référençais store, et donc il fallait préciser dans l'annotation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @ManyToOne(targetEntity=StoreBean.class)
    Si quelqu'un a une autre méthode, je serais intéressé aussi (pour n'écrire que @ManyToOne sans attribut, j'essaie d'utiliser tout le temps les valeurs par défaut.
    J'ai comme un doute ce que tu exposes c'est les session bean, pas les entity à proprement parler. Un session bean peut être remote ou local il me semble pas que ca soit le cas pour une entity.

    Je vais revoir ca, j'ai un gros doute.

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    Citation Envoyé par ®om
    Maintenant une autre question, si dans Product j'ai une référence vers Store, et que dans Store j'ai une référence vers une List<Product>, je vais utiliser d'un côté @ManyToOne et de l'autre côté @OneToMany, mais comment lui faire comprendre que c'est bien la même relation et non deux différentes?
    Je comprend pas trop le sens de ta question, le but de ce mapping est de pouvoir garder les relations entre tes entités. Et de pouvoir accéder aux objets d'un côté la collection et de l'autre l'objet référencé.

    La relation est la même. C'est les cardinalités qui sont exprimés par OneToMany et ManyToOne.

  11. #11
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par *alexandre*
    Je comprend pas trop le sens de ta question, le but de ce mapping est de pouvoir garder les relations entre tes entités. Et de pouvoir accéder aux objets d'un côté la collection et de l'autre l'objet référencé.
    Oui, mais il faut bien lui préciser que cette relation est en fait la même vu de l'autre côté (ça pourrait être une autre, par exemple entre Entreprise et Personne, on pourrait imaginer une entreprise qui a une List<Personne> représentant les employés, et Personne ayant un attribut Entreprise définissant l'entreprise dans laquelle elle aimerait travailler - et non celle où elle travaille -, je te l'accorde c'est tordu, mais c'est pour dire qu'il faut rajouter une contrainte).

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    Ca tu le définis dans @NamedQuery

    edit non rien à voir .. c'est un attribut différent

  13. #13
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par *alexandre*
    Ca tu le définis dans @NamedQuery
    Euh, ...?
    Je ne vois pas bien le lien avec un NamedQuery...
    Ça n'est pas à moi de définir la requête, c'est à ça que sert les @OneToMany et @ManyToOne...

  14. #14
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    vi vi j'ai édité lol, dans ce cas tordu,

    Personne -- travail -- entreprise
    une personne travail pour une entreprise

    par contre si tu veux définir

    Personne -- désire travailler -- entreprise
    une personne désire travailler pour une entreprise

    il faut revoir la définition des champs pour répondre à ces deux relations distinctes.

    personne

    Entreprise entrepriseActuel
    Entreprise entrepriseDésiré

  15. #15
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Citation Envoyé par ®om
    Je ne pense pas, car si je vire Product, Store fonctionne bien

    voici qd mm le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Local
    public interface Store {
     
    ...
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Entity
    public class StoreBean implements Store, Serializable {
     
    ...
     
    }



    Je pense que tu as mal compris l'histoire des interfaces locales concernant les entity beans...

    Je doute que le déploiement de ce que tu as écrit fonctione !

    Tu ne dois pas faire d'interface sur un entity bean comme tu le ferais pour un session bean ! L'histoire que tu as lu concernant l'interface local sur l'entity bean est en fait un session bean stateless sur un entity bean !

    En fait, tu écrit ton entitybean comme tu l'as fait dans ta classe StoreBean, que tu nommes par exemple Store. Puis tu rajoutes un sessions bean avec pour interface StoreLocal et pour classe d'implémentation StoreBean.

    Ce session bean te permet de récupérer un Store à partir de sa clé par exemple, ou de récupérer la liste de tous les Store, de faire persister un Store ou d'en supprimer un ...

    L'interface aurait alors cette tête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Local
    public interface StoreLocal {
     
        public Collection<Store> getStoreList();
     
        public void persistStore(Store s);
     
        public void removeStore(Store s);
     
        public Store findStore(int id);
    }
    Ce session bean te permet donc de manipuler tes entity beans dans la BD (dans la classe d'implémentation, tu devras utiliser un EntityManager). Mais dans ton entity bean Product, tu mets ton entity bean Store ! Et pas ton session bean !

    Comme je ne suis pas sur que tu ai trouvé de la bonne documentation sur les EJB 3, je te conseillerai d'acheter le livre suivant : EJB3 du Laboratoire SUPINFO des technologies Sun, aux éditions DUNOD

    Une vraie bible sur les EJB3, paru à l'automne dernier (et en français ).


    EDIT : après réflexion, ton déploiement tel que tu l'as écrit devrait fonctionner. Cependant tu as écrit un @Local sur l'interface StoreLocal pour rien... Et en fait, ton interface StoreLocal ne te sers à rien...

  16. #16
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Alors, là, merci beaucoup...

    En fait Store c'est l'entity, et ce que tu appelles StoreBean ça correspond à StoreHome en quelque sorte pour les EJB2?

    Donc je vais changer comme ça:
    - Store : (class) Mon @Entity
    - StoreFacade : (interface) le add, remove et find (d'ailleurs, remove, il attend la primary key, pas le store à proprement parler, non?)
    - StoreFacadeImpl ou StoreFacadeBean : (class) l'implantation de StoreFacade

    Qu'en penses-tu?

    (Je débute avec les EJB3 - et avec les EJB2 aussi d'ailleurs, j'ai juste vu ça en cours)

  17. #17
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 189
    Par défaut
    j ai eu un doute un moment

  18. #18
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Citation Envoyé par ®om
    Alors, là, merci beaucoup...

    En fait Store c'est l'entity, et ce que tu appelles StoreBean ça correspond à StoreHome en quelque sorte pour les EJB2?

    Donc je vais changer comme ça:
    - Store : (class) Mon @Entity
    - StoreFacade : (interface) le add, remove et find (d'ailleurs, remove, il attend la primary key, pas le store à proprement parler, non?)
    - StoreFacadeImpl ou StoreFacadeBean : (class) l'implantation de StoreFacade

    Qu'en penses-tu?

    (Je débute avec les EJB3 - et avec les EJB2 aussi d'ailleurs, j'ai juste vu ça en cours)
    Je n'ai fait que trop peu d'EJB2... J'ai surtout manipulé les 3...

    Mais si je ne me trompe pas, en effet, ce que j'appelle StoreBean pourrait être vu comme le Home qui te permet de définir tes propres requêtes sur ces entity beans...

    Concernant le remove, tu peux passer la clé primaire, mais alors tu devras exécuter une requête EJB-QL : "delete from Store s where s.id = ?0"

    Or, je trouve plus propre (cependant ce n'est peut être pas plus performant...) de passer par un entityManager.remove(store), puisque pour la création, tu fais un entityManager.persist(store)... C'est symétrique, et plus "objet" selon moi...

    Sinon, je suis ok avec tes StoreFacade .

    D'ailleurs, tu devras aussi faire de même pour les Products (faire un ProductFacade...). Ca permet de bien structurer le code de tes EJB

  19. #19
    Membre chevronné Avatar de Claythest
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    558
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 558
    Par défaut
    Concernant ton problème de relation multiples entre EJB, regarde du côté de l'attribut mappedBy des relations @OneToMany, ... Je ne sais pas si cela t'aidera...

  20. #20
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Claythest
    Concernant le remove, tu peux passer la clé primaire, mais alors tu devras exécuter une requête EJB-QL : "delete from Store s where s.id = ?0"
    En fait faire un remove(findByPrimaryKey(id)).

    Citation Envoyé par Claythest
    Or, je trouve plus propre (cependant ce n'est peut être pas plus performant...) de passer par un entityManager.remove(store), puisque pour la création, tu fais un entityManager.persist(store)... C'est symétrique, et plus "objet" selon moi...
    Je suis d'accord, mais je n'avais pas trouvé comment faire. En fait au début de ta méthode, avant le remove, il faut faire un tonObjet = em.merge(tonObjet).

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. persist @ManyToMany jpa ejb3
    Par ndeyemaroc dans le forum JPA
    Réponses: 1
    Dernier message: 08/06/2009, 16h59
  2. Réponses: 0
    Dernier message: 13/10/2008, 17h39
  3. [JPA][EJB3] The @JoinColumns on the annotated element
    Par *alexandre* dans le forum JPA
    Réponses: 9
    Dernier message: 19/02/2007, 11h26
  4. Réponses: 4
    Dernier message: 15/02/2007, 10h06
  5. [SQL 2k5] xp_cmdshell - mapped drive - permission erreur
    Par mksql dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 08/02/2007, 16h18

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