可能重复:
Spring, Hibernate - many-to-many - LazyInitializationException
我面临一个很奇怪的问题,我无法理解。
有两个实体“用户”和“联系人”。
在user.getContactSet().add(contact);
我试图在“用户”和“联系人”之间建立多对多的关系
User.java
public class User {
private Integer userID;
private String userLoginEmail;
private String password;
private String userFirstName;
.
.
Contact.java
public class Contact {
private Integer contactID;
private String givenName;
private String familyName;
private String telephoneNumber;
private String cellNumber;
.
.
User.hbm.xml
<hibernate-mapping package="com.smallworks.model" schema="smallworksdb">
<class name="User" table="USERACCOUNT">
<id column="USER_ID" length="500" name="userID">
<generator class="increment" />
</id>
<property column="USER_LOGIN_EMAIL" generated="never" lazy="false" length="100" name="userLoginEmail" />
<property column="USER_PASSWORD" generated="never" lazy="false" length="50" name="password" />
<property column="ACTIVATION_CODE" generated="never" lazy="false" length="100" name="activationCode" />
<property column="ACCOUNT_ACTIVATED" generated="never" lazy="false" length="1" name="accountActivated" />
<set name="contactSet" table="USER_CONTACT"
inverse="false" lazy="true" fetch="select" cascade="all">
<key column="USER_ID"/>
<many-to-many column="CONTACT_ID" class="Contact"/>
</set>
</class>
Contact.hbm.xml
<hibernate-mapping package="com.smallworks.model" schema="smallworksdb">
<class name="Contact" table="CONTACT">
<id column="CONTACT_ID" length="500" name="contactID">
<generator class="increment" />
</id>
<property column="GIVEN_NAME" generated="never" lazy="false" length="100" name="givenName" />
<property column="FAMILY_NAME" generated="never" lazy="false" length="100" name="familyName" />
<property column="TELEPHONE_NUMBER" generated="never" lazy="false" length="100" name="telephoneNumber" />
<property column="CELL_NUMBER" generated="never" lazy="false" length="100" name="cellNumber" />
<property column="EMAIL" generated="never" lazy="false" length="100" name="email" />
<property column="STREET_NAME" generated="never" lazy="false" length="100" name="streetName" />
<property column="CITY" generated="never" lazy="false" length="100" name="city" />
<property column="STREET_ADDRESS" generated="never" lazy="false" length="100" name="streetAddress" />
<property column="ADDRESS_LOCALITY" generated="never" lazy="false" length="100" name="addressLocality" />
<property column="ADDRESS_REGION" generated="never" lazy="false" length="100" name="addressRegion" />
<property column="POSTAL_CODE" generated="never" lazy="false" length="100" name="postalCode" />
<property column="COMMENT" generated="never" lazy="false" length="100" name="comment" />
<!-- many to many mapping with the User via User_Contact table -->
<set name="userSet" table="USER_CONTACT"
inverse="true" lazy="true" fetch="select">
<key column="USER_ID" />
<many-to-many column="CONTACT_ID" class="Contact" />
</set>
</class>
ProjectController.java
@RequestMapping(value = { "/project/addContact.do" }, method = RequestMethod.POST)
@ResponseBody
@JsonIgnore
public String addContact(@ModelAttribute("UserContactAction") ContactAction contactAction, BindingResult result, HttpServletRequest request, Model model) {
User user=(User) request.getSession().getAttribute("user");
if(contactAction!=null){
if(contactAction.getContact()!=null){
Contact contact=contactAction.getContact();
if(contact.getUserSet()==null){
contact.setUserSet(new HashSet<User>());
}
user.getContactSet().add(contact); //ERROR Gets thrown here
}
}else{
System.out.println("userContactAction is NULL");
}
例外:
01:13:26.953 [http-bio-8080-exec-9] DEBUG o.s.w.b.a.s.HandlerMethodInvoker - Invoking request handler method: public java.lang.String com.smallworks.controller.ProjectController.addContact(com.smallworks.model.view.ContactAction,org.springframework.validation.BindingResult,javax.servlet.http.HttpServletRequest,org.springframework.ui.Model)
01:13:26.961 [http-bio-8080-exec-9] ERROR o.h.LazyInitializationException - failed to lazily initialize a collection of role: com.smallworks.model.User.contactSet, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.smallworks.model.User.contactSet, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:372) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:365) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
at org.hibernate.collection.PersistentSet.add(PersistentSet.java:212) [hibernate-core-3.3.1.GA.jar:3.3.1.GA]
at com.smallworks.controller.ProjectController.addContact(ProjectController.java:96) [ProjectController.class:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [na:1.6.0_33]
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) [na:1.6.0_33]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) [na:1.6.0_33]
at java.lang.reflect.Method.invoke(Unknown Source) [na:1.6.0_33]
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) [spring-web-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) [spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) [spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) [spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) [spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) [spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) [spring-webmvc-3.0.5.RELEASE.jar:3.0.5.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) [servlet-api.jar:na]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) [servlet-api.jar:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) [catalina.jar:7.0.33]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.33]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) [catalina.jar:7.0.33]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) [catalina.jar:7.0.33]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [catalina.jar:7.0.33]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) [catalina.jar:7.0.33]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) [catalina.jar:7.0.33]
我很困惑,为什么这个例外即将到来,任何形式的帮助将不胜感激。 我也尝试将用户和联系人带走,而是尝试在Employee和Meeting之间做很多事情(只创建了一些独立的对象),然后一切正常。 请帮忙......