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:
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:
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:
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:
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:
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.