在項目中使用
hibernate (5.2.4.Final)
jpa (1.10.5.RELEASE)
spring (4.2.0.RELEASE)
如果在entity bean 中使用了 fetch=FetchType.LAZY 。
- 在做junit這種非web容器使用的時候,出現如下錯誤
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ......., no session or session was closed
解決辦法:
添加事務配置註解。junit代碼如下:@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath:/META-INF/applicationContext.xml", "classpath:/META-INF/spring-mvc.xml"}) @WebAppConfiguration @Transactional public class InstitutionServiceTest {。。。}
- 在web容器中,如果出現如下錯誤:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session at
解決辦法:
在web.xml中使用一個filter,放在 servlet 配置的後面,代碼如下:<servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:META-INF/spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> <async-supported>true</async-supported> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <filter> <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>Spring OpenEntityManagerInViewFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- 如果使用了json化entity bean的功能,可能會出現如下錯誤:
No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer。。。
因爲序列化對象A時,需要把裏面的多對一關係的B拿出來,而B裏面又有A的集合,如此反覆,便報這樣的錯了
解決辦法:
在entity bean 中使用 @JsonIgnore 註解@OneToOne(fetch=FetchType.LAZY) @JoinColumn(name = "role_id") @JsonIgnore private Role role;