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 :

[EJB3] problème de fetch=lazy avec ejb3


Sujet :

JPA Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 17
    Points
    17
    Par défaut [EJB3] problème de fetch=lazy avec ejb3
    Bonjour,

    voici mon mapping de table en ejb3
    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
    @Entity
    @Table(name="UTILISATEUR")
    public class Utilisateur {
    
    	@Id
    	@Column(name="UTILISATEUR_ID")
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int id;
    
    	@Basic
    	@Column(name="UTILISATEUR_PSEUDO", nullable=false, unique=true)
    	private String pseudo;
    	
    	@OneToMany(fetch=FetchType.LAZY)
    	@JoinColumn(name="DISCUSSION_ID")
    	private java.util.Collection<Discussion> discussions ;
    et l'autre 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
    @Entity
    @Table(name="DISCUSSION")
    public class Discussion {
    
    	@Id
    	@Column(name="DISCUSSION_ID")
    	@GeneratedValue(strategy=GenerationType.AUTO)
    	private int id;
    	
    	@Basic
    	@Column(name="DISCUSSION_LIBELLE", nullable=false, unique=true)
    	private String libelle;
    
    	@ManyToOne(fetch=FetchType.LAZY)
    	@JoinColumn(name="UTILISATEUR_ID",nullable=false) 
    	private Utilisateur utilisateur;
    jusqu'ici tout va bien, la creation fonctionne, mais lorsque je veux sélectionner seulement l'utilisateur (sans les objets discussion lui étant associé), par la requete suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String request = "select u from Utilisateur u";
    		java.util.List<Utilisateur> l = em.createQuery(request).getResultList();
    et bien j'obtiens un objet utilisateur avec la liste des discussions associées.
    Pourtant l'association est définie comme lazy !

    Je ne vois pas de quoi ça vient, pouvez-vous m'aider, svp ?

    Merci d'avance.

    PS : est-ce que quelqu'un pourrait m'expliquer simplement les différents "join" des requetes ? je trouve des explications sur internet, mais c'est pas très clair, et dans quel cas utiliser l'un plutot que l'autre. Re merci d'avance.

  2. #2
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    1- Ton mapping est étonnant. Dans une relation 1-n bidirectionnelle comme c'est le cas chez toi, je ne comprends pas pourquoi tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	@OneToMany(fetch=FetchType.LAZY)
    	@JoinColumn(name="DISCUSSION_ID")
    	private java.util.Collection<Discussion> discussions ;
    Je ferais plutôt ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	@OneToMany(fetch=FetchType.LAZY, mappedBy = "utilisateur")
    	private java.util.Collection<Discussion> discussions ;
    Ceci indique explicitement que l'information pere/fils est portée en base chez le fils via la colonne UTILISATEUR_ID. C'est plus logique car 1 pere peut avoir n fils. Si tu faisais porter l'information par le pere via la colonne DISCUSSION_ID, tu devrais avoir n entrées en base du père (1 pour chaque fils).
    Ceci dit, je ne réponds pas à ta question.

    2- Tant que tu es dans une transaction, tu peux naviguer de manière transparente dans les relations. En particulier, tu peux accéder aux fils d'un père. Pour te répondre, il faudrait savoir quand tu demandes l'accès aux discussions pour l'utilisateur que tu as chargé.
    Si c'est au sein de la mâme transaction, c'est normal. Si c'est en dehors de la transaction (dans une JSP par exemple, ou tout autre client), alors tu devrait avoir une LazyLoad Exception.

    Remarque : les liens 1-n sont lazy par défaut.
    Tout le monde savait que c'était impossible à faire. Puis un jour quelqu'un est arrivé qui ne le savait pas, et il le fit (Winston Churchill)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Merci beaucoup,
    effectivement, j'ai fais une erreur grossière sur le mapping, merci d'avoir relevé le fait.

    pour ce qui est du lazy, c'est encore ma faute, j'étais bien dans une transaction : mon ejb entité était appelé par un ejb session déployé sur le même serveur ...

    merci pour tes précisions xv-mnt (drole de pseudo )

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

Discussions similaires

  1. Problème de JNDI lookup avec EJB3
    Par tweetysat dans le forum Weblogic
    Réponses: 4
    Dernier message: 01/03/2012, 16h32
  2. [Débutant] Problème d’héritage avec EJB3
    Par ghost10 dans le forum Persistance des données
    Réponses: 4
    Dernier message: 28/10/2010, 01h25
  3. Réponses: 1
    Dernier message: 12/04/2010, 17h16
  4. EJB3: Problème avec CascadeType.MERGE
    Par quicotte@gmail.com dans le forum JPA
    Réponses: 1
    Dernier message: 14/06/2007, 09h25
  5. [EJB3] problème d'intéraction avec la BDD
    Par toomsounet dans le forum Wildfly/JBoss
    Réponses: 1
    Dernier message: 15/03/2007, 00h08

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