Hibernate +JPA + Spring + Junit 懶加載問題

在項目中使用 

hibernate (5.2.4.Final) 

jpa   (1.10.5.RELEASE)

spring (4.2.0.RELEASE)


如果在entity bean 中使用了 fetch=FetchType.LAZY 。

  1. 在做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 {。。。}



  2. 在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>



  3.  如果使用了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;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章