延遲加載問題 OpenSessionInView方案

結合上一篇的ssh,討論延遲加載問題

什麼是延遲加載問題 ?

在這裏插入圖片描述
業務層查詢數據,返回後,session關閉了, 表現層獲取數據如果關聯延遲數據,無法初始化 ! (No Session 延遲加載問題 )

舉例:
book類

public class Book {
    private Integer id;
    private String name;
    private Double price;
	
    private User user;
    ......
}

Book.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.itcast.ssh.domain.Book" table="book">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <property name="price"/>

        <many-to-one name="user" class="cn.itcast.ssh.domain.User" column="uid"></many-to-one>
    </class>
</hibernate-mapping>

user類:

public class User {
    private Integer id;
    private String name;
    private Integer age;

    private List<Book> books;
    ......
}

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="cn.itcast.ssh.domain.User" table="user">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <property name="age"/>

        <set name="books" cascade="save-update,delete" inverse="true">
            <key column="uid"></key>
            <one-to-many class="cn.itcast.ssh.domain.User"></one-to-many>
        </set>

    </class>
</hibernate-mapping>

我們在action中獲取User

public class BookAction extends ActionSupport implements ModelDriven<Book> {

	public IUserService userService;

    public void setUserService(IUserService userService){
        this.userService = userService;
    }

    //業務方法:保存圖書
    public String add(){
        List<User> all = userService.findAll();
        System.out.println(all);
        return "NONE";
    }
}

啓動tomcat,在初始化sessionFactory的時候,就會讀取User.hbm.xml和Book.hbm.xml生成對應的表(設置自動建表)

問題: 如何解決延遲加載問題 ?
方案一: 在Xxx.hbm.xml中配置爲立即加載 lazy=false (不推薦 )
方案二: Service方法返回前, 對延遲數據進行初始化 (缺點多寫代碼 )

List<Employee> list = dao.findAll (); 
for(Employee e : list ){
	Hibernate.initialize(e.getDepartment() );
}

方案三: spring提供了OpenSessionInView 機制 (將Session開啓到表現層 最前面 Filter )

Spring 提供 OpenSessionInViewFilter [注意:需要配置在struts2 Filter前面,否則不起作用 ]
web.xml

Hibernate一級緩存

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