說到Hibernate的關聯映射就必須要提一提ORM了。那麼ORM是什麼呢,其是一種持久化技術,他在對象模型和關系型數據庫之間建立對象關系,通過操作JavaBean對象來完成對數據庫的操作!
注意:ORM是概念化的並不是實際存在的,可以理解為其是一種編程思想,而Hibernate框架就是該思想的實現產品!
從上面說到ORM可以在對象模型和數據庫之間建立對應關系而在Hibernate中該關系的建立可以通過xml文件來進行配置詳情請參考《hibernate集成》,該關系的建立是ORM持久化技術實現的基礎,有了該關系的配置才可以使ORM持久化技術成為可能!
從《hibernate集成》中我們可以對javaBean進行和數據庫表對應關系的配置但是如果兩張表存在主外建關系比如:員工有所屬的部門在員工表中存在部門編號的外鍵列時又該如何配置?
按照數據表的結構創建實體類(員工實體類中存放的是部門編號沒有部門名稱)
在員工實體類中添加部門實體類的引用
從上面的兩個解決方案中顯然第二種解決方案要更靠譜一點以為如果是第一種方案的話如果查詢員工信息並且顯示該員工的部門名稱是又該怎麼辦?但是第二種方案中的部門實體類的類型使我們自己定義的類型數據表中並沒有該類型,如何來配置?這時就需要對兩個實體類進行關聯關系的配置了!
上面所遇到的問題就可以通過多對一單項關聯配置來解決。在員工實體類的xml文件配置中將部門實體類的變量進行如下配置:
<many-to-one name="部門實體類變量" column="員工表中關聯部門表的外鍵列的名稱" class="部門實體類的全名稱(如:cn.wz.entity.Dept)" />其中<many-to-one>元素建立了員工表和部門表的主外建之間的映射。它主要包含以下屬性:
如果想要在員工實體類中保存其關聯的部門實體類並且部門實體類中保存與之關聯的員工(多個)則可以配置雙向的一對多關聯
在配置多對一單項關聯的基礎上在部門實體類中添加員工實體類集合的屬性並在其xml配置文件中文件添加如下配置:
<set name=”引用員工實體類集合的屬性名稱”> <key column=”員工表中與部門表關聯的外鍵列名稱”></key> <one-to-many class=”員工實體類的全名稱(如:cn.wz.entity.Emp)”/> </set>set元素的name屬性:設定持久化類的屬性名。此處為引用員工實體類集合的屬性名稱。
set元素還包含兩個子元素:
配置單項多對多關聯與配置一對多關聯類似也是使用set元素,在此時用員工(EMP)和項目(PROJECT)來舉例
如在員工表中保存其參與的多個項目
員工實體類中的代碼如下:
public calss Emp implements java.io.Serializable{ //省略Emp類中的其他屬性 private Set<Project> projects=new HashSet<Project>(0); //省略Emp類中的構造 //省略getter和setter方法 }在其xml配置文件中加入如下配置
<set name=”projects”table=“PROEMP”> <key column=”REMPID”/> <many-to-many class=”cn.wz.entity.Project”column=”RProjectID”/> </set>其中:
set元素的table屬性指定關系表的名稱為PROJECT
set子元素key元素的column屬性指定PROEMP表的外鍵REMPID,用來參照EMP表
many-to-many子元素的class屬性指定projects集合中存放的是Project對象,cloumn屬性指定PROEMP表的外鍵RProjectID用來參照PROJECT表
配置雙向多對多關聯與上面一樣只需將REMPID和RProjectID交換位置即可
注意:在使用多對多關聯時Hibernate會自動在數據庫中創建PROEMP表來連接員工表和項目表該表只有兩列REMPID和RProjectID並且REMPID列為員工表的外鍵、RProjectId為部門表的外鍵