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 :

Persistence et récupération d'une grappe d'objet (one to many)


Sujet :

Hibernate Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut Persistence et récupération d'une grappe d'objet (one to many)
    Bonjour,

    J'ai deux classes : UserEntity et UserRoleEntity avec une relation OneToMany.
    Lorsque je persiste une instance de UserEntity, les roles associés sont bien persistés également. Mais lorsque je veux récupérer l'utilisateur, ses rôles ne sont pas chargés. Et de fait, la table d'association UserEntity_UserRoleEntity est vide.

    Voici mes entités.
    UserEntity :
    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
     
    @Entity
    public class UserEntity implements Serializable {
    	private static final long serialVersionUID = 190946444189883818L;
     
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	@Id
    	private Long id;
     
    	private String firstname;
     
    	private String lastname;
     
    	@Column(nullable = false, unique = true)
    	private String email;
     
    	@Column(nullable = false)
    	private String password;
     
    	private boolean active;
     
    	@OneToMany(fetch=FetchType.EAGER)
    	@Cascade(CascadeType.ALL)
    	private Set<UserRoleEntity> roles;
    UserRoleEntity :
    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
     
    @Entity
    public class UserRoleEntity implements Serializable {
    	private static final long serialVersionUID = 7263633614691880969L;
     
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	@Id
    	private Long id;
     
    	@Column(nullable = false)
    	private String role;
     
    	@ManyToOne
    	@JoinColumn(nullable=false)
    	private UserEntity user;
    Et voici mon DAO :
    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
     
    public void createUser(UserModel user) throws TechnicalException {
    	Session session = sessionFactory.getCurrentSession();
     
    	// save user
    	UserEntity entity = UserTranslator.toEntity(user);
    	Long id = (Long) session.save(entity);
    	user.setId(id);
    }
     
    public UserModel getUserByEmail(String email) throws TechnicalException {
    	Session session = sessionFactory.getCurrentSession();
    	Query query = session.createQuery("from UserEntity user where user.email = :email");
    	query.setParameter("email", email);
     
    	UserEntity entity = (UserEntity) query.uniqueResult();
    	return UserTranslator.toModel(entity);
    }

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Bonjour,
    Essaie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query query = session.createQuery("from UserEntity user join fetch user.roles where user.email = :email");
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Alors j'ai essayé ta requête, et ça me retourne null. Alors que la mienne me retourne un user sans roles.

    Je pense que ça vient du fait que la table d'association est vide.

    Pour moi le problème vient de l'insertion, mais je n'arrive pas à trouver la solution.

  4. #4
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Bonjour,
    Au vu de l'heure de ta réponse j'imagine que tu ne peux tester qu'une fois rentré chez toi? j'aurais bien voulu que tu récupérés le SQl généré par hibernate et le teste directement dans un browser SQL pour voir les données remontées,si elles correspondent à ton attente c'est que le souci pourrait résider dans ton mapping.Le souci ne saurait être dans l'insertion puisque tu dis voir les données que t'insères.
    Vous avez peut être hâte de réussir et il n'y a rien de mal à cela...
    mais la patience est aussi une vertu; l'échec vous l'enseignera certainement..."

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Points : 653
    Points
    653
    Par défaut
    Salut DevServlet, merci pour ta réponse, effectivement je travaille sur un projet perso.

    En fait j'ai trouvé la solution. Contrairement à ce que je pensais, il semble que la table d'association ne soit pas nécessaire puisqu'il ne s'agit pas d'une relation many-to-many.

    Il suffisait d'ajouter l'attribut "mappedBy" à l'annotation @OneToMany :
    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
    
    @Entity
    public class UserEntity implements Serializable {
    
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	@Id
    	private Long id;
    
    	private String firstname;
    
    	private String lastname;
    
    	@Column(nullable = false, unique = true)
    	private String email;
    
    	@Column(nullable = false)
    	private String password;
    
    	private boolean active;
    	
    	@OneToMany(cascade=CascadeType.ALL, mappedBy="user")
    	private Set<UserRoleEntity> roles;
    }

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/05/2011, 10h00
  2. problème de récupération d'une liste d'objet au niveau des DAO
    Par yness dans le forum Persistance des données
    Réponses: 1
    Dernier message: 25/04/2011, 19h57
  3. Comment récupérer une grappe d'objet ?
    Par verbose dans le forum Hibernate
    Réponses: 4
    Dernier message: 02/04/2010, 15h59
  4. [DisplayTag] Navigation dans une grappe d'objets
    Par abdel1025 dans le forum Taglibs
    Réponses: 1
    Dernier message: 09/02/2009, 16h37
  5. Erreur lors du marshalling d'une grappe d'objet avec Castor XML
    Par mbinte dans le forum Persistance des données
    Réponses: 2
    Dernier message: 29/08/2008, 17h07

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