javaEE Hibernate, 實體物件的三種狀態

NO IMAGE

瞬時狀態:沒有id,沒有在快取session中
持久化狀態:有id,在快取session中
遊離|託管狀態:有id,沒有在快取session中

瞬時狀態=>save=>根據主鍵生成策略生成id,並放到session快取中=>持久化狀態
瞬時狀態=>setId()=>手動設定id=>遊離|託管狀態=>update()=>放到session快取中=>持久化狀態
持久化狀態=>session.close()=>遊離|託管狀態
沒有id(瞬時狀態);有id(遊離狀態)=>saveOrUpdate()=>持久化狀態
持久化狀態=>提交事務=>真正儲存到資料庫中

Test.java:

package cn.xxx.demo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.xxx.domain.Customer;
import cn.xxx.utils.HibernateUtils;
//物件的三種狀態
public class Test {
@Test
//實體物件的三種狀態
public void fun1(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務
Transaction tx = session.beginTransaction();
//3執行操作
Customer c = new Customer(); // 沒有id, 沒有與session關聯 => 瞬時狀態
c.setCust_name("聯想"); // 瞬時狀態
session.save(c); // 持久化狀態, 有id,與session有關聯
//4提交事務.關閉資源
tx.commit();  // 只有提交事務時,才會真正儲存到資料庫。
session.close();// 遊離|託管 狀態, 有id , 沒有關聯
}
@Test
//三種狀態特點
//save方法: 其實不能理解成儲存.可以理解成將瞬時狀態轉換成持久狀態的方法.(只是為了獲取id)(根據主鍵生成策略生成id,執行任意的增刪改查都會與session產生關聯)
//主鍵生成策略,主鍵自增(identity):執行save方法時,為了將物件轉換為持久化狀態.必須生成id值.所以需要執行insert語句生成.(提交事務才真正儲存)
//主鍵生成策略increment: 執行save方法,為了生成id.會執行查詢id最大值的sql語句,並不會執行insert語句。(提交事務後才會真正儲存到資料庫)
public void fun2(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務
Transaction tx = session.beginTransaction();
//3執行操作
Customer c = new Customer(); // 沒有id, 沒有與session關聯 => 瞬時狀態
c.setCust_name("聯想"); // 瞬時狀態
session.save(c); // 持久化狀態, 有id,有關聯。並沒有儲存到資料庫,只是根據id生成策略獲取id;提交事務後才儲存到資料庫。
//4提交事務.關閉資源
tx.commit();
session.close();// 遊離|託管 狀態, 有id , 沒有關聯
}
@Test
//三種狀態特點
// 持久化狀態特點: 持久化狀態物件的任何變化都會自動同步到資料庫中.
public void fun3(){
//1 獲得session
Session session = HibernateUtils.openSession();
//2 控制事務
Transaction tx = session.beginTransaction();
//3執行操作
Customer c = session.get(Customer.class, 1l); //持久化狀態物件
c.setCust_name("微軟公司");  // 持久化狀態的物件進行修改。提交事務後,會自動更新到資料庫中。
//4提交事務.關閉資源
tx.commit();  
session.close();// 遊離|託管 狀態, 有id , 沒有關聯
}
}

HibernateUtils.java(Hibernate連線資料庫的工具類):

package cn.xxx.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static SessionFactory sf;  // 一個web中只需要一個SessionFactory物件。
static{
//1 建立Configuration物件,預設載入src下的hibernate.cfg.xml配置檔案
Configuration conf = new Configuration().configure();
//2 根據配置資訊,建立 SessionFactory物件
sf = conf.buildSessionFactory();
}
//獲得session => 獲得全新session
public static Session openSession(){
//3 獲得session
Session session = sf.openSession();
return session;
}
//獲得session => 獲得與執行緒繫結的session(當前session)
public static Session getCurrentSession(){
//3 獲得session
Session session = sf.getCurrentSession();
return session;
}
}