1. 程式人生 > >Hibernate 持久化對象狀態

Hibernate 持久化對象狀態

mage 相同 import delet 官方 t對象 nfa oid bsp

持久化對象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 持久化對象狀態