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

Hibernate Java Discussion :

OneToMany - Annotation


Sujet :

Hibernate Java

  1. #1
    Membre confirmé Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Par défaut OneToMany - Annotation
    Hello,

    Je cherche à créer une relation du type :
    - une entité User possède zéro ou plusieures entité(s) Adress - une adresse ne peut exister sans User.
    Question basique : est-ce bien un one-to-many ?
    Niveau DB, dans la table user pas de référence sur les adresses; dans la table Adress une fk(iduser) : cela vous semble bon ?
    Me manque t'il des annotations pour les contraintes citées ?

    UserEntity :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @Entity
    @EntityListeners({ LastUpdateListener.class })
    @Table(name = "user")
    @AttributeOverrides({
        @AttributeOverride(name = "entityId", column = @Column(name = "iduser")),
        @AttributeOverride(name = "creationDate", column = @Column(name = "ohdtcre")) })
    public class UserEntity extends DefaultEntity {
    	@OneToMany(mappedBy = "user")
    	public Set<AdressEntity> adresses;
    AdressEntity :
    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
     
    @Entity
    @EntityListeners({ LastUpdateListener.class })
    @Table(name = "adress")
    @AttributeOverrides({
        @AttributeOverride(name = "entityId", column = @Column(name = "idadre")),
        @AttributeOverride(name = "lastModificationDate", column = @Column(name = "ohdatmod")),
        @AttributeOverride(name = "creationDate", column = @Column(name = "ohdatcre")) })
    public class AdressEntity extends DefaultEntity {
     
    	@Column(name = "txadrerue")
    	private String rue;
     
    	@ManyToOne
    	@JoinColumn(name = "iduser")
    	private UserEntity user;
    Mon soucis : depuis que j'ai migré aux annotations, 1 user qui a 2 adresses me retourne 2 entity au lieu d'une entity contenant la liste des 2 adresses...

    Help, merci !

  2. #2
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 51
    Par défaut
    Salut,

    Je ne suis pas sure mais cela pourrait être à cause de la similitude entre :
    @Table(name = "user")
    @OneToMany(mappedBy = "user")
    private UserEntity user

    Est ce que vous pouvez tester avec le code ci dessous :


    Citation Envoyé par rgomes Voir le message
    Hello,

    Je cherche à créer une relation du type :
    - une entité User possède zéro ou plusieures entité(s) Adress - une adresse ne peut exister sans User.
    Question basique : est-ce bien un one-to-many ?
    Niveau DB, dans la table user pas de référence sur les adresses; dans la table Adress une fk(iduser) : cela vous semble bon ?
    Me manque t'il des annotations pour les contraintes citées ?

    UserEntity :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Entity
    @EntityListeners({ LastUpdateListener.class })
    @Table(name = "user")
    @AttributeOverrides({
        @AttributeOverride(name = "entityId", column = @Column(name = "iduser")),
        @AttributeOverride(name = "creationDate", column = @Column(name = "ohdtcre")) })
    public class UserEntity extends DefaultEntity {
    	@OneToMany(mappedBy = "addrUser")
    	public Set<AdressEntity> adresses;
    AdressEntity :
    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
    @Entity
    @EntityListeners({ LastUpdateListener.class })
    @Table(name = "adress")
    @AttributeOverrides({
        @AttributeOverride(name = "entityId", column = @Column(name = "idadre")),
        @AttributeOverride(name = "lastModificationDate", column = @Column(name = "ohdatmod")),
        @AttributeOverride(name = "creationDate", column = @Column(name = "ohdatcre")) })
    public class AdressEntity extends DefaultEntity {
    
    	@Column(name = "txadrerue")
    	private String rue;
    
    	@ManyToOne
    	@JoinColumn(name = "iduser")
    	private UserEntity addrUser;
    Mon soucis : depuis que j'ai migré aux annotations, 1 user qui a 2 adresses me retourne 2 entity au lieu d'une entity contenant la liste des 2 adresses...

    Help, merci !

    J’espère que ça pourra vous aider
    A+

  3. #3
    Membre confirmé Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Par défaut
    Merci pour la réponse mais ça n'a pas résolu le problème.

    Des avis ?

    Merci !

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Mon soucis : depuis que j'ai migré aux annotations, 1 user qui a 2 adresses me retourne 2 entity au lieu d'une entity contenant la liste des 2 adresses...
    Je comprend peut-être mal ta phrase mais cela me semble normal que depuis un user tu obtiennes deux AdressEntity contenu dans un Set.

  5. #5
    Membre confirmé Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Par défaut
    Au lieu d'avoir une entité user contenant un set de 2 adresses, j'ai 2 entités user.
    Merci pour toute aide

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Le problème vient peut-être de ta requête , et pas des annotations.

    Sinon tu peux aussi spécifier ta clé étrangère sur la table "Address" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @JoinColumn(name = "iduser", referencedColumnName="foreignKeyUserEntity")
    @ManyToOne
    private UserEntity addrUser;

  7. #7
    Membre confirmé Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Par défaut
    Même comportement ça ne corrige pas.

    La requête SQL générée est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select iduser 
    from user this_ left outer join adress adresses2_ on this_.iduser=adresses2_.iduser
    Je ne comprends pas ce que j'oublie..

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Oui ta requête est étrange , qu'es que tu essaies de faire avec ? De connaitre tous les utilisateurs qui ont bien une adresse ?

  9. #9
    Membre confirmé Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Par défaut
    Ma problématique est simple : j'ai une entité User qui possède 2 adresses.
    Hibernate est sensé me retourner un seul UserEntity contenant un set de 2 adresseEntity.

    Mais je crois avoir trouvé : je dois chercher du côté de mes méthodes hascode/equals et je dois avoir un set de user et non une collection pour éviter les doublons...Je test ca ce soir.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    Je crois qu'avec ta requête sans condition tu vas forcement renvoyer tous les utilisateurs de la table user car tu fais un left outer join.

    Donc si tu as 2 Users dans la table user c'est normal qu'elle te les retourne.

    Avec Hibernate j'utilise les named query, par exemple avec mon entity customer si je veux qu'il me renvoi un client en fonction de son id :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @NamedQueries({ @NamedQuery(name = "Customer.findByIdCustomer", 
        query = "SELECT c FROM Customer c WHERE c.idCustomer = :idCustomer")})
    Je place cette annotation dans la fichier de la classe customer, avant sa déclaration.

    Ensuite j'ai un bean qui s'occupe d’exécuter les requêtes et de retourner les Entity en fonction des paramètres. Dans mon customer bean si je veux trouver un utilisateur grâce à son id j'utilise cette méthode par ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Override
        public Customer findCustomer(String idCustomer) {
            Query query = em.createNamedQuery("Customer.findByIdCustomer");
            query.setParameter("idCustomer", idCustomer);
            return (Customer) query.getSingleResult();
        }
    Et la avec l'entity customer que me renvoi la méthode je peux obtenir , la liste des achats par exemple. Dans mon entity customer j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "customer")
    private Set<Purchase> purchaseSet;
     
    ...
     
    public Set<Purchase> getPurchaseSet() {
         return purchaseSet;
    }
    Et dans l'entity purchase j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    @JoinColumn(name = "num_customer", referencedColumnName = "num_customer",
        insertable = false, updatable = false)
        @ManyToOne(optional = false)
        private Customer customer;
    Et bien sur pour mes entity , les méthodes hashcode et equals sont redéfinis .

  11. #11
    Membre confirmé Avatar de rgomes
    Homme Profil pro
    IT Developer JAVA Senior
    Inscrit en
    Juin 2004
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : IT Developer JAVA Senior
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2004
    Messages : 128
    Par défaut
    Merci pour ta réponse.

    Mais je suis arrivé au résultat attendu en blindant mes hashcode/equals et en utilisant les Set. Une seule requête me retourne tous les users avec leurs adresses respectives.

    Ta solution va générer x requêtes par user cumulé à y requêtes par adresse, ce qui commence à faire pas mal

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Par défaut
    J'avais pas compris que ton but était d'obtenir tous les utilisateurs de la table mais que tu voulais seulement récupérer un utilisateur à la fois.

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

Discussions similaires

  1. Problème avec l'annotation oneToMany
    Par kata001 dans le forum JPA
    Réponses: 1
    Dernier message: 03/01/2014, 08h31
  2. Aide sur les annotations Hibernate - @OneToMany
    Par gargantua dans le forum Hibernate
    Réponses: 1
    Dernier message: 19/03/2011, 16h33
  3. [EJB3 Entity] Problème avec les annotations de type @OneToMany
    Par Hello_World dans le forum Java EE
    Réponses: 6
    Dernier message: 30/08/2010, 14h20
  4. Annotation OneToMany probleme.
    Par zuzuu dans le forum Hibernate
    Réponses: 3
    Dernier message: 10/02/2009, 13h15

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