成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

初步了解Hibernate與對象共事

開發 后端
Hibernate是完整的對象/關系映射解決方案,它提供了對象狀態管理(state management)的功能,使開發者不再需要理會底層數據庫系統的細節。

Hibernate與對象是如何共事的呢?Hibernate是完整的對象/關系映射解決方案,它提供了對象狀態管理(state management)的功能,使開發者不再需要理會底層數據庫系統的細節。

也就是說,相對于常見的JDBC/SQL持久層方案中需要管理SQL語句,Hibernate采用了更自然的面向對象的視角來持久化Java應用中的數據。

換句話說,使用Hibernate的開發者應該總是關注對象的狀態(state),不必考慮SQL語句的執行。這部分細節已經由Hibernate掌管妥當,只有開發者在進行系統性能調優的時候才需要進行了解。

1. Hibernate對象狀態(object states)

Hibernate定義并支持下列對象狀態(state):

瞬時(Transient) - 由new操作符創建,且尚未與Hibernate Session 關聯的對象被認定為瞬時(Transient)的。瞬時(Transient)對象不會被持久化到數據庫中,也不會被賦予持久化標識(identifier)。如果程序中沒有保持對瞬時(Transient)對象的引用,它會被垃圾回收器(garbage collector)銷毀。使用Hibernate Session可以將其變為持久(Persistent)狀態。(Hibernate會自動執行必要的SQL語句)

持久(Persistent) - 持久(Persistent)的實例在數據庫中有對應的記錄,并擁有一個持久化標識(identifier)。 持久(Persistent)的實例可能是剛被保存的,或剛被加載的,無論哪一種,按定義對象都僅在相關聯的Session生命周期內的保持這種狀態。

Hibernate會檢測到處于持久(Persistent)狀態的對象的任何改動,在當前操作單元(unit of work)執行完畢時將對象數據(state)與數據庫同步(synchronize)。開發者不需要手動執行UPDATE。將對象從持久(Persistent)狀態變成瞬時(Transient)狀態同樣也不需要手動執行DELETE語句。

脫管(Detached) 與持久(Persistent)對象關聯的Session被關閉后,對象就變為脫管(Detached)的。對脫管(Detached)對象的引用依然有效,對象可繼續被修改。脫管(Detached)對象如果重新關聯到某個新的Session上, 會再次轉變為持久(Persistent)的(Detached其間的改動將被持久化到數據庫)。

這個功能使得一種編程模型,即中間會給用戶思考時間(user think-time)的長時間運行的操作單元(unit of work)的編程模型成為可能。 我們稱之為應用程序事務,即從用戶觀點看是一個操作單元(unit of work)。

接下來我們來細致的討論下狀態(states)及狀態間的轉換(state transitions)(以及觸發狀態轉換的Hibernate方法)。

2. 使對象持久化

Hibernate認為持久化類(persistent class)新實例化的對象是瞬時(Transient)的。我們可將瞬時(Transient)對象與session關聯而變為持久(Persistent)的。

  1. DomesticCat fritz = new DomesticCat();  
  2. fritz.setColor(Color.GINGER);  
  3. fritz.setSex('M');  
  4. fritz.setName("Fritz");  
  5. Long generatedId = (Long) sess.save(fritz); 

如果Cat的持久化標識(identifier)是generated類型的,那么該標識(identifier)會自動在save()被調用時產生并分配給cat。如果Cat的持久化標識(identifier)是assigned類型的,或是一個復合主鍵(composite key),那么該標識(identifier)應當在調用save()之前手動賦予給cat。 你也可以按照EJB3 early draft中定義的語義,使用persist()替代save()。

此外,你可以用一個重載版本的save()方法。

  1. DomesticCat pk = new DomesticCat();  
  2. pk.setColor(Color.TABBY);  
  3. pk.setSex('F');  
  4. pk.setName("PK");  
  5. pk.setKittens( new HashSet() );  
  6. pk.addKitten(fritz);  
  7. sess.save( pk, new Long(1234) ); 

如果你持久化的對象有關聯的對象(associated objects)(例如上例中的kittens集合)那么對這些對象(譯注:pk和kittens)進行持久化的順序是任意的(也就是說可以先對kittens進行持久化也可以先對pk進行持久化),除非你在外鍵列上有NOT NULL約束。 Hibernate不會違反外鍵約束,但是如果你用錯誤的順序持久化對象(譯注:在pk持久之前持久kitten),那么可能會違反NOT NULL約束。

通常你不會為這些細節煩心,因為你很可能會使用Hibernate的傳播性持久化(transitive persistence)功能自動保存相關聯那些對象。 這樣連違反NOT NULL約束情況都不會出現了Hibernate會管好所有的事情。傳播性持久化(transitive persistence)將在本章稍后討論。

3. 裝載對象

如果你知道某個實例的持久化標識(identifier),你就可以使用Session的load()方法 來獲取它。 load()的另一個參數是指定類的.class對象。 本方法會創建指定類的持久化實例,并從數據庫加載其數據(state)。

  1. Cat fritz = (Cat) sess.load(Cat.class, generatedId);  
  2. // you need to wrap primitive identifiers  
  3. long pkId = 1234;  
  4. DomesticCat pk = (DomesticCat) sess.load( Cat.class, new Long(pkId) );  

此外, 你可以把數據(state)加載到指定的對象實例上(覆蓋掉該實例原來的數據)。

  1. Cat cat = new DomesticCat();  
  2. // load pk's state into cat  
  3. sess.load( cat, new Long(pkId) );  
  4. Set kittens = cat.getKittens(); 

請注意如果沒有匹配的數據庫記錄,load()方法可能拋出無法恢復的異常(unrecoverable exception)。 如果類的映射使用了代理(proxy),load()方法會返回一個未初始化的代理,直到你調用該代理的某方法時才會去訪問數據庫。 若你希望在某對象中創建一個指向另一個對象的關聯,又不想在從數據庫中裝載該對象時同時裝載相關聯的那個對象,那么這種操作方式就用得上的了。 如果為相應類映射關系設置了batch-size, 那么使用這種操作方式允許多個對象被一批裝載(因為返回的是代理,無需從數據庫中抓取所有對象的數據)。

如果你不確定是否有匹配的行存在,應該使用get()方法,它會立刻訪問數據庫,如果沒有對應的行,會返回null。

  1. Cat cat = (Cat) sess.get(Cat.class, id);  
  2. if (cat==null) {  
  3.     cat = new Cat();  
  4.     sess.save(cat, id);  
  5. }  
  6. return cat; 

你甚至可以選用某個LockMode,用SQL的SELECT ... FOR UPDATE裝載對象。 請查閱API文檔以獲取更多信息。

  1. Cat cat = (Cat) sess.get(Cat.class, id, LockMode.UPGRADE); 

注意,任何關聯的對象或者包含的集合都不會被以FOR UPDATE方式返回, 除非你指定了lock或者all作為關聯(association)的級聯風格(cascade style)。

任何時候都可以使用refresh()方法強迫裝載對象和它的集合。如果你使用數據庫觸發器功能來處理對象的某些屬性,這個方法就很有用了。

  1. sess.save(cat);  
  2. sess.flush(); //force the SQL INSERT  
  3. sess.refresh(cat); //re-read the state (after the trigger executes) 

此處通常會出現一個重要問題: Hibernate會從數據庫中裝載多少東西?會執行多少條相應的SQLSELECT語句? 這取決于抓取策略(fetching strategy),這里我們不再做以解釋。

【編輯推薦】

  1. 簡述Hibernate中加載并存儲對象
  2. Hibernate傳播性持久化攻略
  3. 深入了解Hibernate自動狀態檢測
  4. 教你如何在Hibernate中實例化集合和代理
  5. Hinerbate單端關聯代理頗析
責任編輯:仲衡 來源: redsaga
相關推薦

2022-12-22 13:18:54

深度學習框架

2019-11-05 10:18:04

RPM包RPMLinux

2016-08-03 15:32:50

GitLinux開源

2009-11-11 16:34:45

Visual Stud

2023-01-06 19:19:16

TensorFlow

2012-02-08 14:24:35

HibernateJava

2012-08-30 14:17:42

IBMdw

2010-09-09 16:21:32

TCP IP網絡協議

2021-09-02 15:29:42

鴻蒙HarmonyOS應用

2009-09-23 10:14:10

Hibernate使用

2009-09-29 10:46:58

Hibernate領域

2009-09-25 13:14:58

Hibernate C

2009-09-24 16:22:50

Hibernate自動

2024-02-04 09:05:52

持久態對象數據庫

2009-10-30 09:45:55

VB.NET Web

2011-02-18 09:01:26

Microsoft V

2016-11-14 17:36:57

Angular 2應用程序端對端

2011-02-17 15:22:28

Microsoft V

2023-11-02 07:55:31

Python對象編程

2009-09-22 11:27:41

模型對象Hibernate
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线看无码的免费网站 | caoporn国产精品免费公开 | 久久亚洲欧美日韩精品专区 | 日韩欧美视频免费在线观看 | 国产人成精品一区二区三 | 做a的各种视频 | 欧美成人一区二免费视频软件 | 国产精品国产a级 | 91亚洲一区 | 色婷婷精品久久二区二区蜜臂av | 亚洲一区二区免费 | 99tv成人影院 | 无码国模国产在线观看 | 欧美在线国产精品 | 91大片| 欧美高清视频在线观看 | 一本一道久久a久久精品综合 | 欧美成人激情视频 | 欧美亚洲国产一区二区三区 | 日韩精品1区2区3区 成人黄页在线观看 | 亚洲精品福利视频 | 成人久久网 | 毛片黄片| 在线视频h| 久久精品国产v日韩v亚洲 | 五十女人一级毛片 | 黄色大片免费观看 | 伊人免费在线观看高清 | 一级片免费在线观看 | 91视视频在线观看入口直接观看 | 日韩视频精品在线 | 免费a大片 | 久久久久久免费免费 | 国产欧美一区二区三区在线看 | 成人国产在线视频 | 国产精品久久 | 国产第一区二区 | 午夜久久久久久久久久一区二区 | 91国产视频在线 | 欧美a区| 日韩欧美中文字幕在线观看 |