對象的狀態
臨時狀態
new出的對象
持久化狀態
get,save,update
脫管狀態
clear close evict
session.get方法取出一個持久化對象,同時產生這個對象的快照,如何判斷何時對該對象進行update操作?將快照和該對象進行對比,當快照值和對象值不一致的時候,發出update語句,否則不發。
主鍵生成器改爲identity
session.save(person);
session.evict(person);
transaction.commit();
session執行save操作時候,就發出了insert語句。執行evict操作時候,person對象轉爲爲託管狀態。事務提交,因爲已經發出過了insert語句了,person雖然爲託管狀態,但是不影響事務的提交,所有和數據庫發生了交互。
import org.hibernate.Session; import org.hibernate.Transaction; import org.junit.Test; import cn.itcat.domain.ConfigUtil; import cn.itcat.domain.Person; public class StateTest extends ConfigUtil{ /** * session.save方法把一個臨時狀態的對象轉化成持久化狀態的對象 */ @Test public void testSavePerson(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Person person = new Person(); person.setPname("afds"); person.setPsex("af"); session.save(person); transaction.commit(); session.close(); } /** * session.update方法可以把一個對象的狀態變成持久化狀態 */ @Test public void testUpdate(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Person person2 = new Person();//臨時狀態 person2.setPid(1L);//臨時狀態 session.update(person2);//updat方法是將一個臨時狀態的對象轉化爲持久化狀態對象 transaction.commit();//發出sql語句 session.close(); } /** * 當session.get方法得到一個對象的時候,是不需要再執行 update語句,因爲已經是持久化狀態 * 當一個對象是一個持久化對象的時候,當進行提交的時候,hibernate內部會讓該對象和快照進行對比,如果一樣,則不發出update語句 * 如果不一樣,則發出update語句 */ @Test public void testGet(){ Session session = sessionFactory.openSession(); //Transaction transaction = session.beginTransaction(); Person person = (Person)session.get(Person.class, 1L);//get取出的對象就是一個持久化對象 person.setPname("tt"); //session.update(person); //transaction.commit(); session.close(); } /** * session.clear方法把所有的對象從session中清空 */ @Test public void testClear(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Person person = (Person)session.get(Person.class, 1L); person.setPname("asd"); session.clear();//把session中所有的對象清空 session.update(person);//把對象從脫管狀態轉化成持久化狀態 transaction.commit(); session.close(); } /** * session.evict把一個對象從session中清空 */ @Test public void testEvict(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Person person = (Person)session.get(Person.class, 1L); person.setPname("asdsss"); session.evict(person);//脫管狀態 session.update(person);//把對象的狀態轉化成持久化狀態 transaction.commit(); session.close(); } /** * 一個對象是否是持久化對象是針對某一個session而言的 */ @Test public void testSession(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Person person = (Person)session.get(Person.class, 1L); person.setPname("asfd"); transaction.commit(); session.close(); session = sessionFactory.openSession(); transaction = session.beginTransaction(); person.setPname("aaaaaaa");//person對象對於94的session來說是一個臨時狀態的對象 //session.update(person); transaction.commit(); session.close(); } /** * 當執行transaction.commit的時候,hibernate內部會檢查session * 1、如果一個對象爲臨時狀態的對象,則session不會管 * 2、如果一個對象是持久化狀態的對象,如果有ID值,並且和數據庫對應,那麼先把該對象與快照進行對比,如果一致,則什麼都不做,如果不一致,則發出update語句 * 3、如果一個對象是持久化狀態的對象,如果沒有ID值,則會發出save語句 */ @Test public void testMuplyOption(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Person person = new Person(); person.setPname("rrr"); person.setPsex("asdfasdf"); Person person3 = new Person(); person3.setPname("rrr"); person3.setPsex("asdfasdf"); session.save(person); Person person2 = (Person)session.get(Person.class, 1L); person2.setPname("afds45"); transaction.commit(); session.close(); } @Test public void testMutiplyOption2(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Person person = new Person(); person.setPname("asdfads"); person.setPsex("er"); session.save(person); transaction.commit(); session.evict(person); session.close(); session = sessionFactory.openSession(); transaction = session.beginTransaction(); session.update(person); session.clear(); transaction.commit(); session.close(); } @Test public void testTransaction(){ Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); Person person = (Person) session.get(Person.class, 1L);//這個person在 第一個事務之中 person.setPname("11"); //person在第一個session的事務中 session =sessionFactory.openSession();//這是第二個session,如果把這個session給註釋了,那麼第一個session開啓了兩個事務,即使第一個事務不提交,第二個事務提交,仍然可以和數據庫發生交互,因爲這兩個事務都在同一個session中 Transaction transaction2 = session.beginTransaction(); person.setPname("22"); //person在第一個session的事務中 transaction2.commit(); //transaction.commit();//第一個session的事務不提交,不會和數據庫發生交互 session.close(); } }