I have the following Entity classes, when I run my application, I get the following exception. Some of these other issues do not solve the problem.
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)
How can I solve this problem?
Emp Entity
@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;
Depth entity
@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 Jersey Service
@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; }
Spring applicationContext.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" > <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" /> <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>