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 + org.hibernate.LazyInitializationException


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut ejb3 + org.hibernate.LazyInitializationException
    Bonjour, je travail sur projet utilisant des ejb3 + hibernate+ jpa +webservice.

    je developpe sous netbeans et j utilise glassfish comme serveur d application.

    J ai deux entiy bean,

    un entity user avec les attributs suivants

    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
     @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "id_spy_user")
        private Integer idSpyUser;
        @Basic(optional = false)
        @Column(name = "email")
        private String email;
        @Basic(optional = false)
        @Column(name = "password")
        private String password;
        @Column(name = "first_name")
        private String firstName;
        @Column(name = "last_name")
        private String lastName;
        @Column(name = "phone")
        private String phone;
        @Lob
        @Column(name = "address")
        private String address;
        @Column(name = "session")
        private String session;
        @JoinColumn(name = "spy_user_group", referencedColumnName = "id_spy_user_group")
        @ManyToOne
        private SpyUserGroup spyUserGroup;
    et un autre group
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "id_spy_user_group")
        private Integer idSpyUserGroup;
        @Basic(optional = false)
        @Column(name = "name")
        private String name;
        @OneToMany(mappedBy = "spyUserGroup")
        private List<SpyUser> spyUserCollection;
    j utilise un session bean qui fait appel a un persistence manager, dont voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @PersistenceContext
        private EntityManager em;
    @Override
          public List<SpyUser> findAll() {
            return em.createQuery("select object(o) from SpyUser as o").getResultList();
        }
    ce seesion bean est appele tout d abord par un autre session bean, qui verifie si un user et admin ou pas avant de faire appel a la methode findAll

    voici le code
    @EJB
    private UserSessionLocal userSessionBean;
    @EJB
    private SpyUserFacadeLocal userFacade;
    public List<SpyUser> getUsers(String key) {
    List<SpyUserProtected> spyUserList = new ArrayList();
    try {
    if (userSessionBean.setSession(key) && getUserByKey(key).getSpyUserGroup().getName().equals("admin")) {
    List<SpyUser> spyUserSrc = userFacade.findAll();


    return spyUserSrc;
    }
    } catch (Exception ex) {
    Logger.getLogger(UserControllerBean.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;

    }

    la methode getUsers et expose par un webservice

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
        @EJB
        private UserControllerLocal ejbUserRef;
     
        // Add business logic below. (Right-click in editor and choose
        // "Web Service > Add Operation"
     
        @WebMethod(operationName = "getUsers")
        public List<SpyUser> getUsers(@WebParam(name = "key") String key) {
            return ejbUserRef.getUsers(key);
        }
    L exception arrive quand je fais appel a la methode du web service par la page web que l on obtien avec netbeans en faisant test webservice.

    auparavant la base a etait rempli par une classe config qui est appele par un programme de test junit.

    donc l erreur et la suivante

    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
     
    Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: entity.UserGroup.userCollection, no session or session was closed
            at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
            at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
            at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:343)
            at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:86)
            at org.hibernate.collection.PersistentBag.iterator(PersistentBag.java:249)
            at com.sun.xml.bind.v2.runtime.reflect.Lister$CollectionLister.iterator(Lister.java:278)
            at com.sun.xml.bind.v2.runtime.reflect.Lister$CollectionLister.iterator(Lister.java:265)
            at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:129)
            at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
            at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
            at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
            at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:150)
            at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
            at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
            at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:65)
            at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:168)
            at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:152)
            at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:322)
            at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:681)
            at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:277)
            at com.sun.xml.bind.v2.runtime.BridgeImpl.marshal(BridgeImpl.java:100)
            at com.sun.xml.bind.api.Bridge.marshal(Bridge.java:141)
            at com.sun.xml.ws.message.jaxb.JAXBMessage.writePayloadTo(JAXBMessage.java:315)
            at com.sun.xml.ws.message.AbstractMessageImpl.writeTo(AbstractMessageImpl.java:142)
            at com.sun.xml.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:108)
            at com.sun.xml.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:258)
            at com.sun.xml.ws.transport.http.HttpAdapter.encodePacket(HttpAdapter.java:320)
            at com.sun.xml.ws.transport.http.HttpAdapter.access$100(HttpAdapter.java:93)
            at com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:454)
            at com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:244)
            at com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:135)
            at com.sun.enterprise.webservice.JAXWSServlet.doPost(JAXWSServlet.java:176)

    j ai fais quelques recherches sur le forum mais j ai rien trouve de bien concluant,


    merci de prendre un peu de temps pour me repondre.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 142
    Par défaut
    Regarde du coté de l'attribut lazy d'hibernate. Mais je suis sur que ce problème a déjà été résolu sur le forum !

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    j ai fais beucoup de site et je ne trouve pas comment resoudre mon probleme j ai essayer de changer le lazy en FetchType.EAGER j ai aussi une exception que je comprend pas

    Caused by: com.sun.istack.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: entity.UserGroup[idUserGroup=272] -> entity.User[idUser=443] -> entity.UserGroup[idUserGroup=272]

    j avoue que je suis perdu est ce quelqu un peux me venir en aide

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 298
    Par défaut
    D'un côté tu as ton graphe d'objet "hibernate" qui peut contenir des cycles : ManyToMany bidirectionnel

    D'un autre côté tu as une représentation XML de ton graphe d'objet. Cette représentation ne supporte pas les cycles et les associations bidirectionnelles.

    En XML un fils qui est inclut dans son père n'as pas besoin d'un pointeur vers son père.

    Tu as plusieurs solutions pour t'en sortir :
    - supprimer les cycles dans ton graphe "hibernate" : a toi de savoir si tu as besoins de relation bi-directionnelle ou pas
    - passer par des objets de transitions entre tes deux représentations : DTO ( ça sent un peu l'anti-pattern localDTO quand même )

  5. #5
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    ok j ai compris merci, par contre saurais tu comment resoudre mon probleme de lazy exception.

  6. #6
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 25
    Par défaut
    c est bon j ai trouve le probleme de lazy est du aussi a la relation bidirectionel, quand je fais le getUsers hibernate recupere les user et leurs groupe mais ne fait pas lance pas la getCollection. Je sais pas is je suis bien clair, par contre y a t il un moyen pour corriger ca si toute fois j arrive a resoudre le probleme je vais surement etre confronte a mon exception xml cite au dessus non?

Discussions similaires

  1. Réponses: 8
    Dernier message: 13/08/2014, 17h42
  2. Réponses: 4
    Dernier message: 02/03/2012, 14h11
  3. Réponses: 3
    Dernier message: 13/07/2011, 10h42
  4. Réponses: 4
    Dernier message: 11/04/2008, 12h12

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