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] Récupération des collections des Entity Bean


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 3
    Par défaut [EJB3] Récupération des collections des Entity Bean
    Bonjour a tous, j'ai le problême suivant :

    J'ai deux entity bean : Product et ProductFamily.

    Dans Product j'ai :

    ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @ManyToOne(optional = false)
    @JoinColumn(name="family_fk", referencedColumnName="id")
    protected ProductFamily productFamily;
     
    public ProductFamily getProductFamily() {
    	return productFamily;
    }
     
    public void setProductFamily(ProductFamily productFamily) {
    	this.productFamily = productFamily;
    }
    ...
    et dans ProductFamily :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ...
    @OneToMany(mappedBy="productFamily")
    protected Collection<Product> products;	
     
    public Collection<Product> getProducts() {
     
    	return products;
    }
     
     
    public void setProducts(Collection<Product> products) {
    	this.products = products;
    }
     ...
    Je travaille avec JBoss et je le laisse géré les transactions avec la base.

    Tout ce passe bien, lorsque je créer un Product et que je le persist, il l'ajoute bien à la base etc, de ce coté la pas de problême. Par contre, lorsque j'essaye de récuperer la liste des Products ( getProducts () dans la classe ProductFamily ), il me renvoit l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    	at org.hibernate.LazyInitializationException.<init>(LazyInitializationException.java:19)
    	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
    	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
    	at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:97)
    	at org.hibernate.collection.PersistentBag.size(PersistentBag.java:222)
    	at com.tikaf.main.main.main(main.java:68)
    Tous les autres getters fonctionnent, il n'y a que pour les collections que sa déconne. Je ne peux pas les récupérer sous peine d'avoir cette erreur.

    Quelqu'un pourrait il m'aider ?

    Merci bcp !!

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    LazyInitializationException, veut dire que tu essaies d'accéder à une donnée non chargée.
    Soit, tu fais ton getProducts au sein d'une session Hibernate ouverte, soit tu fais en sorte que ta collection soit chargée, par exemple en utilisant l'attribut fetch dans une requête Hql ou Criteria.

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 3
    Par défaut
    Tout d'abords merci pour la reponse.

    Pourtant j'utilise un fetchType.EAGER qui normalement charge la collection en meme temps que l'entité ( comme tous les autres propriétés avec lesquels cela fonctionne très bien ) . En effet mon Lazy est à false.

    Tu pourrais me donner un exemple de requete ? Je connais l'EJB-QL mais je ne connais pas Hql ni Critéria ( Jsuis encore débutant ).

    Une autre question : Peut on utiliser une requete EJB-QL dans un entity bean et si oui comment doit on procéder ?

    Merci encore !!

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Ce que je dis vaut pour Hibernate, je ne connais pas assez bien EJB3.
    En théorie, si tu as lazy = false, tu ne devrais pas avoir de LazyInitializationException.

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 74
    Par défaut
    Le code que tu donnes ne stipules nulle part que l'association oneToMany est eager, il te faut le modifier avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    @OneToMany(mappedBy="productFamily",fetch=FetchType.EAGER)
    protected Collection<Product> products;	
     ...
    Autre remarque, le @JoinColumn n'est pas nécessaire de l'autre coté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @ManyToOne(optional = false)
    protected ProductFamily productFamily;
    Le joincolumn sera plutot utilisé de l'autre coté (dans la classe Product Familiy) afin que l'orm soit en mesure de déterminer le nom de la colonne de jointure dans le cas d'une association unidirectionnelle (pas d'attribut productFamily dans Product)

    Sinon, de mémoire si tu laisses la stratégie de fetch par défaut (i.e LAZY),tu peux utiliser HQL pour faire ton extraction (certainement préférable en fonction de ton contexte, afin d'éviter des chargement massifs d'infos que ne t'interesseront pas toujours: syndrome du n+1 select).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    List result = session.createQuery("select pf from  ProductFamily join fetch pf.products where ...").list();
    Je note encore que tu as deux problèmes: le premier etait le réglement de la politique de fetch (traité ci dessus), le deuxieme semble être une dépendance non respectée: il lui manque le jar qui contient org/apache/commons/logging/LogFactory... ca doit etre commomnsloging d'apache ou un truc dans le style qui est fournie dans la distrib d'hibernate

Discussions similaires

  1. Application pour collecter des données des autres sites
    Par nes.zou dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 21/11/2013, 13h05
  2. Problème de passage des paramétrés aux entity Beans
    Par herguem dans le forum Java EE
    Réponses: 1
    Dernier message: 07/06/2012, 14h13
  3. Réponses: 6
    Dernier message: 27/04/2011, 21h44
  4. Réponses: 0
    Dernier message: 27/04/2011, 13h00
  5. Récuperer la collection des noms des propriétés
    Par belocom dans le forum VB.NET
    Réponses: 2
    Dernier message: 16/05/2007, 02h01

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