Hibernate-----物件三種狀態
瞬時態(臨時態):transient,session沒有快取物件,資料庫也沒有對應記錄。
1.沒有與Hibernate產生關聯. 2.與資料庫中的記錄沒有產生關聯(有關聯就是與資料庫中的id有對應).
OID特點:沒有值
持久態:persistent,session快取物件,資料庫最終會有記錄。(事務沒有提交)
OID特點:有值
遊離態(託管態):detached,session沒有快取物件,資料庫有記錄。
. 1.沒有與Hibernate產生關聯 2.物件有ID
OID特點:有值
package com.itheima.a_state;
import org.hibernate.Session;
import org.junit.Test;
import com.itheima.domain.User;
import com.itheima.utils.HibernateUtils;
//物件的三種狀態
public class Demo1 {
@Test
//演示三種狀態
public void fun1(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u = new User(); // 瞬時狀態
u.setName("tom"); // 瞬時狀態
u.setPassword("1234"); // 瞬時狀態
session.save(u); // 持久狀態
//問題: 呼叫完save方法,資料庫中有沒有對應記錄?
// 沒有對應記錄, 但是最終會被同步到資料庫中.仍然是持久狀態.
//------------------------------------------------
session.getTransaction().commit(); // 持久狀態
session.close(); // 遊離狀態
}
@Test
//三種狀態的轉換
// 瞬時 => 持久
public void fun2(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u = new User(); // 瞬時狀態
u.setName("tom"); // 瞬時狀態
u.setPassword("1234"); // 瞬時狀態
session.save(u); // 持久狀態 save方法會使用主鍵生成策略,為User指定id. =>
//主鍵自增 => 列印 insert語句
// increment=> select max(id) ....
//assigned => 需要手動指定主鍵,不指定將會報錯
//------------------------------------------------
session.getTransaction().commit(); // 持久狀態
//事務提交時,會把持久化狀態物件同步到資料庫中
session.close(); // 遊離狀態
}
// 瞬時=> 遊離
// 瞬時: 沒有關聯,沒有id
// 遊離: 沒有關聯,有id(與資料庫中對應的id)
@Test
public void fun3(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
User u = new User(); // 瞬時狀態
u.setId(1); //遊離
//----------------------------------------------------
session.getTransaction().commit(); // 持久狀態
//事務提交時,會把持久化狀態物件同步到資料庫中
session.close(); // 遊離狀態
}
@Test
// 持久=> 瞬時
// 持久: 有關聯,有id
// 瞬時: 無關聯,無id
public void fun4(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
//通過get方法,得到持久狀態物件
User u= (User) session.get(User.class, 1); // 持久狀態
//----------------------------------------------------
session.getTransaction().commit(); // 持久狀態
//事務提交時,會把持久化狀態物件同步到資料庫中
session.close(); // 遊離狀態
u.setId(null);//瞬時狀態
}
@Test
// 持久=> 瞬時
// 持久: 有關聯,有id
// 瞬時: 無關聯,無id
public void fun5(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
//通過get方法,得到持久狀態物件
User u= (User) session.get(User.class, 1); // 持久狀態
session.evict(u);//將User物件與session的關聯移除
u.setId(null);//瞬時狀態
session.save(u);//持久狀態
//----------------------------------------------------
session.getTransaction().commit(); // 持久狀態
//事務提交時,會把持久化狀態物件同步到資料庫中
session.close(); // 遊離狀態
}
// 持久=> 遊離
@Test
// 持久=> 遊離
// 只需要將session的關聯取消
public void fun6(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
//通過get方法,得到持久狀態物件
User u= (User) session.get(User.class, 1); // 持久狀態
session.evict(u);//遊離
//----------------------------------------------------
session.getTransaction().commit(); // 遊離狀態
session.close(); // 遊離狀態
}
@Test
// 遊離=> 瞬時
// 移除ID
public void fun7(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
//通過get方法,得到持久狀態物件
User u= (User) session.get(User.class, 1); // 持久狀態
session.evict(u);//遊離
u.setId(null);// 瞬時
//----------------------------------------------------
session.getTransaction().commit(); // 瞬時狀態
session.close(); // 瞬時狀態
}
@Test
// 遊離=> 持久
// 是否與Session關聯
public void fun8(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
//通過get方法,得到持久狀態物件
User u= (User) session.get(User.class, 1); // 持久狀態
session.evict(u);//遊離
session.update(u);//持久
//----------------------------------------------------
session.getTransaction().commit(); // 持久狀態 -> 列印update語句
session.close(); // 瞬時狀態
}
//三種狀態有什麼用?
// 持久狀態,我們使用Hibernate主要是為了持久化我們的資料.
// 對於物件的狀態,我們期望我們需要同步到資料庫的資料,都被裝換成持久狀態
//持久化狀態特點: Hibernate會自動將持久化狀態物件的變化同步到資料庫中.
@Test
// 遊離=> 持久
// 是否與Session關聯
public void fun9(){
Session session = HibernateUtils.openSession();
session.beginTransaction();
//------------------------------------------------
//通過get方法,得到持久狀態物件
User u= (User) session.get(User.class, 1); // 持久狀態
//u.setName("jerry");// 為持久狀態
u.setId(3);//與session建立關聯的物件的ID,不允許修改. ------------- 報錯
session.update(u);// 多餘=> 因為Hibernate會自動將持久化狀態物件的變化同步到資料庫中.
//----------------------------------------------------
session.getTransaction().commit(); // 持久狀態 -> 列印update語句
session.close(); // 瞬時狀態
}
}