1. 程式人生 > >hibernate第二天

hibernate第二天

on() figure rac 相關 ransac client per creat 獲取對象

1.修改
update()
merge(): save() update() 有沒有OID
saveOrUpdate() 修改
saveOrUpdate()和merge()區別
解析:區別 1:saveOrUpdate() 會改變入參進來對象的狀態 merge不會
區別 2: saveOrUpdate() 沒有返回值 merge返回一個對象
2.OID
OID 是持久化類(Student)與數據表主鍵對應屬性, 用來唯一區分持久化對象。
3.刪除
4.PO VO DTO POJO JavaBean
JavaBean=POJO 和數據庫無關的 PageUtil類,需要持久化不不需要
PO=POJO+xml
5.主鍵生成策略
Increment :hibernate生成,弊端:多線程可能取到的是同一個id,但是導致其他線程保存失敗
identity: 數據庫生成 ,mysql支持,oracle不支持
sequence: 數據庫生成,oracle支持
native: 數據庫決定:mysql使用identity,oralce使用序列
uuid Hibernate生成 優點:不會重復,數據遷移比較好 要求:列的類型字符串
assigned :程序員手動操作的。

OID
Hibernate中Java對象的三種狀態
get和load

在 increment基礎之上操作!
hibernate中的三種狀態
瞬時狀態:在數據庫中沒有關聯的數據,沒有加入Session中。
持久狀態:被session管理,擁有數據庫標識。
遊離狀態:脫離了與其關聯的session的管理。

01.瞬時狀態 Student stu=new Student();
新創建的對象,沒有與session產生關聯!
02.持久狀態 session.save(stu)
被session管理,存在session緩存中!當commit的時候,會提交到數據庫!
03.遊離狀態 session.close(); stu
曾經被session管理過,但是現在不存在session緩存中了!


瞬時狀態 和遊離狀態的區別在於:是否被session管理過! 對象是否擁有OID(對象標識符)!

對象有主鍵值id,那麽就有OID,在操作的時候會執行update語句!
沒有主鍵值id,那麽就沒有OID,在操作的時候會執行insert語句!

對象只要是沒有OID,在執行update()肯定報錯!在執行saveOrupdate的時候會執行Save()方法!

三種狀態的轉換:
(1).瞬時狀態轉換為持久狀態
使用Session的Save( ),SaveOrUpdate( )等方法保存對象後,該對象的狀態有瞬時 狀態轉為持久狀態。
使用Session的get( )或load( )方法獲取對象,該對象的狀態是持久狀態
(2).持久狀態轉為瞬時狀態
執行Session的delete( )方法後,對象由原來的持久狀態變為瞬時狀態,因此時對象沒有與任何的數據庫數據關聯。
(3).持久狀態轉為遊離狀態
執行Session( )的evict( ),clear( )或close( )方法,對象由原來的持久狀態轉為遊離狀態。
(4).遊離狀態轉為持久轉態
執行Session的Update()或saveOrUpdate( )方法,對象由遊離狀態轉為持久狀態,該對象再次與當前Session相關聯。
(5).遊離狀態轉為瞬時狀態
執行的Session的delete( )方法,對象由遊離狀態轉為瞬時狀態。

6.核心API
6.1 Configuration
InputStream x = ConfigHelper.getResourceAsStream("/hibernate.properties");
hibernate.hbm.xml配置文件
6.2 SessionFactory:重量級的,一個程序中一份就可以了。線程安全的。
Creates Sessions. Usually an application has a single SessionFactory.
Threads servicing client requests obtain Sessions from the factory.
創建會話。通常, 應用程序有一個單一的 SessionFactory。
服務客戶端請求的線程從工廠獲取會話。
SessionFactorys are immutable. The behaviour of a SessionFactory
is controlled by properties supplied at configuration time.
These properties are defined on Environment.
SessionFactorys 是不可變的。SessionFactory 的行為由配置時提供的屬性控制。
這些屬性是在環境中定義的。
線程安全的::方法中來用一個對象,不用考慮線程安全問題
成員變量,發現他是一個接口,接口中都是方法

6.3 Session 他也是一個接口,實現類是SessionImpl ,當中也是方法,但是他是線程非安全的。
Session構建兩種方式
方式一:factory.openSession(); 隨機從連接池中獲取到一個連接。每次取得的session一定是新的。
factory.getCurrentSession(); 一定獲取的是和當前線程綁定的session.調度多次,內存地址一樣,同一個對象

6.4 事務

7.刷新緩存(某一時刻點觸發的動作)
tx.commit() ;刷新緩存 刷新緩存做什麽 (做臟檢查)
快照(Snapshot)是某個數據集在某一特定時刻的鏡像,也稱為即時拷貝,它是這個數據集的一個完整可用的副本


Configuration cfg;
Session session;
Transaction tx;
SessionFactory factory;
@Before
public void myBefore(){
//創建配置對象
cfg=new Configuration().configure();
// 2.根據配置對象創建SessionFactory
factory=cfg.buildSessionFactory();
//3.根據SessionFactory去創建Session
session= factory.openSession();

//3.5在Session創建後開啟事務 xxx0001 xxxxx003
tx= session.beginTransaction();
}
@Test
public void loadTest(){
Dog dog = session.get(Dog.class, 6);
System.out.println(dog.getDogname());
}
@Test
//01.修改
public void testUpdate(){
//修改一個編號為2的狗狗信息
Transaction tx = session.beginTransaction();
Dog dog=new Dog();//瞬時態
dog.setDogname("嘿嘿");
dog.setDogage(12);
session.merge(dog);//持久態
/* Dog dog=session.load(Dog.class,2);
dog.setDogname("大黃3");
dog.setDogage(33);
session.update(dog);*/
tx.commit();
System.out.println("update ok!");
}
//02.刪除
@Test
public void testDelete(){
//修改一個編號為2的狗狗信息
Transaction tx = session.beginTransaction();
Dog dog=new Dog();//瞬時態
System.out.println(session+"===========================");
/* session.delete(dog);
tx.commit();*/
System.out.println("del ok!");
}
@Test
public void testCahce(){
Dog dog2 = session.get(Dog.class, 6);
System.out.println(dog2.getDogname());

Dog dd=new Dog();
dd.setDogage(11);
dd.setDogname("小花是狗");
dd.setDogid(11);
session.update(dd);
tx.commit();
Dog dog = session.get(Dog.class, 6);
System.out.println(dog.getDogname());
System.out.println(dd.getDogname());
//
}

hibernate第二天