結合上一篇的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