我有以下提到的实体类,当我执行我的应用程序时,我得到了以下异常。其他一些类似的问题也不能解决问题。
WARNING: StandardWrapperValve[jersey-serlvet]: PWC1406: Servlet.service() for servlet jersey-serlvet threw exception org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: test.entity.Dept.empDeptno, no session or session was closed at org.hibernate.collection.internal.AbstractPersistentCollection. throwLazyInitializationException(AbstractPersistentCollection.java:393) at org.hibernate.collection.internal.AbstractPersistentCollection. throwLazyInitializationExceptionIfNotConnected (AbstractPersistentCollection.java:385) at org.hibernate.collection.internal.AbstractPersistentCollection. initialize(AbstractPersistentCollection.java:378)
我该如何解决这个问题?
Emp实体
@Entity @Table(name = "EMP", schema = "SCOTT" ) @XmlRootElement @NamedQueries({ @NamedQuery(name = "Emp.findAllEmployees", query = "select e from Emp e left join fetch e.deptNo order by e.empno desc") }) public class Emp implements java.io.Serializable { @Id @Column(name = "EMPNO", unique = true, nullable = false, precision = 4, scale = 0) private short empno; @ManyToOne @JoinColumn(name = "DEPTNO", referencedColumnName = "DEPTNO") private Dept deptNo;
部门实体
@Entity @Table(name = "DEPT", schema = "SCOTT" ) @XmlRootElement public class Dept implements java.io.Serializable { @Id @Column(name = "DEPTNO", unique = true, nullable = false, precision = 2, scale = 0) private short deptno; @OneToMany(fetch=FetchType.LAZY,mappedBy = "deptNo") private Set<Emp> empDeptno;
DAOImpl
@Override public List<Emp> findAllEmployees() { return getEntityManager().createNamedQuery("Emp.findAllEmployees", Emp.class).getResultList(); }
泽西岛RESTful服务
@Component @Path("/employee") public class EmployeeRestService { @Autowired EmployeeService employeeService; @GET @Produces({MediaType.APPLICATION_JSON}) public List<Emp> getEmployees() { List<Emp> emp = new ArrayList<Emp>(); emp.addAll(getEmployeeService().findAllEmployees()); return emp; }
springapplicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd" > <!-- Data Source Declaration --> <bean id="DataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="jdbc/scottDS"/> </bean> <context:component-scan base-package="net.test" /> <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="DataSource" /> <property name="packagesToScan" value="net.test" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="showSql" value="false" /> <property name="generateDdl" value="false" /> <property name="databasePlatform" value="${jdbc.dialectClass}" /> </bean> </property> </bean> <bean id="defaultLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" /> <!-- Transaction Config --> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> <context:annotation-config/> <bean id="hibernateStatisticsMBean" class="org.hibernate.jmx.StatisticsService"> <property name="statisticsEnabled" value="true" /> <property name="sessionFactory" value="#{entityManagerFactory.sessionFactory}" /> </bean> </beans>
我已通过在web.xml中添加以下内容解决了该问题
<filter> <filter-name>OpenEntityManagerInViewFilter</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenEntityManagerInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
在这里和这里礼貌
谢谢