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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 45
    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 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;
        }
     
    }

  5. #5
    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...

  6. #6
    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)

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

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

  8. #8
    Expert confirmé


    Profil pro
    Inscrit en
    Mai 2003
    Messages
    3 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 3 240
    Par défaut
    Citation Envoyé par Claythest

    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 ).
    Et elle est où ta critique de livre, qu'on la publie sur dvp.com pour que tout le monde en profite ?

  9. #9
    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...

  10. #10
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    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.

  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 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.

  12. #12
    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?

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    2 189
    Détails du profil
    Informations personnelles :
    Âge : 45
    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.

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

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