uuid
UUID(Universally Unique Identifier)全局唯一標識符,是指在一臺機器上生成的數(shù)字,它保證對在同一時空中的所有機器都是唯一的。
它是hibernate中生成主鍵比較有效的一種方式
<generator class="uuid.hex"/>
對象的狀態(tài)
以下是建立在customer和order項目一對多的基礎(chǔ)之上
1)瞬時狀態(tài)
就是創(chuàng)建一個和session無關(guān)的與數(shù)據(jù)庫的數(shù)據(jù)也無關(guān)的對象钦铺,它不能夠長久的保存下來
//瞬態(tài)對象
Customer customer1=new Customer(null, "name1", "telephone1");
2)持久狀態(tài)
為什么叫半持久狀態(tài)呢蹦骑?因為session中的數(shù)據(jù)還沒有commit到數(shù)據(jù)庫中
//半持久化對象
session.save(customer1);
3)脫管狀態(tài)
數(shù)據(jù)庫中有顧客id為1的用戶民效,但是session中沒有保存customer4的引用就是脫管狀態(tài)禀酱。
1炬守,第一種
Customer customer4=new Customer(1L, "", "");
2,第二種
Customer customer5=(Customer) session.get(Customer.class, 2L);
session.clear();//清空了session中的數(shù)據(jù)
customer5.setName("11");
tran.commit();
這里的customer5不能夠更新比勉。因為session不在維護它了劳较。
session.clear();//清空了session中的數(shù)據(jù)
customer5.setName("11");
session.update(customer5);
tran.commit();
update可以將脫管態(tài)變?yōu)槌志脩B(tài)驹止。
session的緩存
session在事物提交前會使用flush來刷新緩存中的sql語句到數(shù)據(jù)庫
手動設置刷新浩聋,如果沒有寫flush,控制臺會有sql語句臊恋,但是數(shù)據(jù)庫中沒有保存數(shù)據(jù)衣洁。(沒有設置新模式的時候默認自動刷新)
//1,設置不自動刷新
session.setFlushMode(FlushMode.NEVER);
session.flush();
只寫session.setFlushMode(FlushMode.NEVER);控制臺就不會出現(xiàn)sql語句抖仅,沒有把session中的數(shù)據(jù)保存到數(shù)據(jù)庫中坊夫。
這兩句都寫了,但是沒有submit就會出現(xiàn)控制臺有sql語句撤卢,但是數(shù)據(jù)庫中沒有數(shù)據(jù)环凿。
ession.setFlushMode(FlushMode.NEVER);
session.flush();
SessionFactory 是重量級的類,它要讀取配置信息放吩,它在會把一些常見的sql語句提前保存起來智听。
SessionFactory factory=config.buildSessionFactory();
session中維護了一個集合,集合中保存著相關(guān)聯(lián)的半持久化對象的引用如(session.save(custmoer))渡紫。當合適的時機就會把數(shù)據(jù)保存到數(shù)據(jù)庫當中到推。
瞬時對象的數(shù)據(jù)保存到內(nèi)存當中。其實有兩個指針指向內(nèi)存中的對象(即customer中的數(shù)據(jù))惕澎,一個是棧區(qū)中它本身的引用(Customer和Session)莉测。
擴展:棧中存放的是一些基本類型的變量和對象的引用變量,堆中存放的是new創(chuàng)建的對象和數(shù)組(垃圾回收機制回收堆的數(shù)據(jù))唧喉,方法區(qū)放的是一些方法和靜態(tài)屬性和方法捣卤。
[Stack棧和Heap堆的區(qū)別]
session中維護持久態(tài)對象忍抽,好處是它可以監(jiān)聽到對象的變化。監(jiān)聽到后立刻產(chǎn)生一條sql語句董朝。目的是保證數(shù)據(jù)庫和用戶更新的數(shù)據(jù)是一致的梯找。
比如:結(jié)果就是沒調(diào)用update自動就更新了
Customer customer=(Customer) session.load(Customer.class, 1L);
customer.setName("one");
常用的方法
1)save(obj)
obj 瞬態(tài)!用第一種
將瞬態(tài)轉(zhuǎn)化為持久態(tài)對象
obj 脫管 不推薦
重新保存一個新的對象
obj 持久態(tài)
沒意義
2)update(obj)
obj 脫管
將脫管態(tài)轉(zhuǎn)換為持久態(tài)
3)saveOrUpdate(obj)
如果obj是瞬態(tài)對象,保持save
如果obj是脫管對象,更新update
4)load(Customer.class, 2L)在你需要輸出的時候才去數(shù)據(jù)庫查益涧,如果沒有輸出就不查詢也不報錯
5)get(Customer.class, 2L)先去數(shù)據(jù)庫查然后沒有結(jié)果就返回null锈锤。
1)lazy
true 延遲加載,查詢當前對象的時候暫時先不查詢與之關(guān)聯(lián)的對象
false 立即加載闲询,查詢當前對象的時候查詢所有與之關(guān)聯(lián)的對象久免。
**2)inverse **
一般寫在set中
默認false 當前方可以維護關(guān)系(產(chǎn)生外鍵)
true 當前方不維護關(guān)系(不產(chǎn)生外鍵)
下面的cascade主從方維護關(guān)系會產(chǎn)生影響
3)cascade
一般寫在set中
級聯(lián)操作
save-update
customer
<set name="orders" cascade="save-update">
</set>
保存數(shù)據(jù)
Session session=HibernateSessionFactory.getSession();
Transaction tran=session.beginTransaction();
Customer customer=new Customer(null, "terry", "12324212");
Order o1=new Order(null,"100.0",new Date());
Order o2=new Order(null,"120.0",new Date());
customer級聯(lián)order(主方維護從方)
order會比下面的多一個更新外鍵的操作
customer.getOrders().add(o1);
customer.getOrders().add(o2);
session.save(customer);
session.save(o1);
session.save(o2);
order維護customer(從方維護主方)
o1.setCustomer(customer);
o2.setCustomer(customer);
session.save(customer);
session.save(o1);
session.save(o2);
刪除
delete
刪除保存更新
all
解除關(guān)系即刪除
delete-orphan
刪除保存更新,解除關(guān)系即刪除
all-delete-orphan