Hibernate 持久化對象狀態
持久化對象PO類狀態
1.狀態分類
transient 瞬時態:hibernate的session緩存中沒有存放,數據庫中沒有數據。例如新建的po類,沒有OID值
persistent 持久態:hibernate的session緩存中存放,數據庫中最終會有。例如save(po) 完成commit操作,有OID值
detached 脫管態:hibernate的session緩存中沒有,數據庫中有數據。脫離session的管理,有OID值
2.OID
OID:hibernate用於標記PO類
java區分對象:地址
數據 區分數據:主鍵不同
例如:
new Student().setSid(1)
new Student().setSid(1)
認為兩個相同PO類
3.狀態之間的轉換
瞬時態:
轉換持久態:save() | saveorUpdate() 如果有OID將執行saveorUpdate(),沒有OID將執行save()
脫管態:手動設置OID
Student stu = new Student(); //瞬時態
stu.setSid(1) //脫管,如果數據庫中OID對應數據不存在,拋出異常
持久態:
瞬時態:執行delete() 記住。網上所說是:刪除態,官方沒有給出
脫管態:evict、close、clear
evict():將指定PO類從session中移除
clear():將session緩存清除,清除所有
close():session關閉不存在session緩存
脫管態:
瞬時態:執行delete() 手動移除OID
持久態:執行update()、saveorUpdate()
4.一級緩存
一級緩存:指hibernate session級別的緩存,在session緩存數據
get()通過id查詢PO類,將查詢的結果緩存到一級緩存(session)
代碼如下
package cn.hibernate.test;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.hibernate.bean.Student;
public class CacheTest {
private SessionFactory factory = new Configuration()
.configure().addClass(Student.class)
.buildSessionFactory();
@Test
public void demo01(){
Session session = factory.openSession();
//查詢id為1的Student對象
/*Hibernate:
load cn.hibernate.bean.Student select
student0_.sId as sId0_0_,
student0_.sName as sName0_0_
from
Student student0_
where
student0_.sId=?
Student [sId=1, sName=333]
*/
Student student=(Student)session.get(Student.class, 1);
System.out.println(student);
}
@Test
public void demo02(){
Session session = factory.openSession();
//查詢兩次id為1的Student對象,按理應該產生兩條sql語句,其實只有一條。但是出現了兩個相同對象的輸出結果
/*Hibernate:
load cn.hibernate.bean.Student select
student0_.sId as sId0_0_,
student0_.sName as sName0_0_
from
Student student0_
where
student0_.sId=?
Student [sId=1, sName=333]
Student [sId=1, sName=333]
*/
Student student=(Student)session.get(Student.class, 1);
System.out.println(student);
//調用evict()方法清除session中student對象進一步查看產生sql語句
// session.evict(student);
System.out.println("********************************************");
/*Hibernate:
load cn.hibernate.bean.Student select
student0_.sId as sId0_0_,
student0_.sName as sName0_0_
from
Student student0_
where
student0_.sId=?
Student [sId=1, sName=333]
Hibernate:
load cn.hibernate.bean.Student select
student0_.sId as sId0_0_,
student0_.sName as sName0_0_
from
Student student0_
where
student0_.sId=?
Student [sId=1, sName=333]
*/
Student student1=(Student)session.get(Student.class, 1);
System.out.println(student1);
}
}
Hibernate 持久化對象狀態