session的管理:
1)save():把臨時狀態變爲持久化狀態(交給Sessioin管理)
Session session = sessionFactory.openSession();
session.beginTransaction();
// --------------------------------------------
User user = new User(); // 臨時狀態
user.setName("test");
session.save(user); // 變爲了持久化狀態
// --------------------------------------------
session.getTransaction().commit();
session.close();
user.setName("李四"); // 遊離狀態
System.out.println(user.getName()); // 遊離狀態
2)update():把遊離狀態變爲持久化狀態
在更新時,對象不存在就報錯
session.clear(); // 清除Session中所有的對象
session.evict(user); // 清除Session中一個指定的對象
3)saveOrUpdate():把臨時或遊離狀態轉爲持久化狀態
在更新時,對象不存在就報錯
本方法是根據id判斷對象是什麼狀態的:如果id爲原始值(對象的是null,
原始類型數字是0)就是臨時狀態,如果不是原始值就是遊離狀態。
User user = new User();
user.setId(3); // 自己生成一個遊離狀態對象
user.setName("newName");
session.saveOrUpdate(user);//持久化對象
4)delete():把持久化或遊離轉爲刪除狀態
如果刪除的對象不存在,就會拋異常
5)get():獲取數據,是持久化狀態
會生成:select ... where id=?
會馬上執行sql語句
如果數據不存在,就返回null
6)load():獲取數據,是持久化狀態
load()後返回的是一個代理對象,要求類不能是final的,否則不能生成子
類代理,就不能使用懶加載功能了。
讓懶加載失效的方式:
一、把實體寫成final的;
二、在hbm.xml中寫<class ... lazy="false">
不會馬上執行sql語句,而是在第1次使用非id或class屬性時執行sql。
如果數據不存在,就拋異常:ObjectNotFoundException
7)操作大量數據,要防止Session中對象過多而內存溢出
for (int i = 0; i < 30; i++) {
User user = new User();
user.setName("測試");
session.save(user);
if (i % 10 == 0) {
session.flush(); // 先刷出
session.clear(); // 再清空
}
}
user = (User) session.get(User.class, 5); // 持久化
// 刷新Session緩存中對象的狀態,即重新select一下
上session.refresh(user);