Hibernate 一对一关联关系
雙向一對(duì)一關(guān)聯(lián)關(guān)系:
域模型:
例如,部門只有一個(gè)部門經(jīng)理,一個(gè)經(jīng)理也只能管理一個(gè)部門。即,Department 中有一個(gè)Manager的引用,Manager 中又有一個(gè)Department 的引用。
關(guān)系數(shù)據(jù)模型:
按照主鍵映射: 這種方式跟 多對(duì)一關(guān)聯(lián)關(guān)系非常相似,比如department 表有一個(gè)外鍵 MANAGER_ID 指向manager 表的ID, 此時(shí)Department 和 Manager 對(duì)應(yīng)的這兩張表是多對(duì)一的關(guān)聯(lián)關(guān)系,為了實(shí)現(xiàn)一對(duì)一的關(guān)聯(lián)關(guān)系,只要給 外鍵 MANAGER_ID 加上一個(gè)唯一約束,則可以實(shí)現(xiàn)一對(duì)一關(guān)聯(lián)關(guān)系。
需要注意的問題:
①、保存:建議先保存沒有外鍵列的那一端的對(duì)象。
②、查詢:默認(rèn)情況下使用懶加載異常。
③、沒有外鍵的一端需要使用?one-to-one 元素,該元素使用property-ref 屬性指定使用 被關(guān)聯(lián)實(shí)體主鍵以外的字段作為關(guān)聯(lián)字段。
④、在查詢沒有外鍵關(guān)聯(lián)的一端對(duì)象的時(shí)候,使用左外連接一并查詢出其關(guān)聯(lián)的對(duì)象,并進(jìn)行初始化。
也就是說:把懶加載屬性設(shè)為true 的時(shí)候,查詢 Manager 會(huì)一并把Department 查詢出來(lái),但是查詢Department 并不會(huì)把Manager對(duì)象查詢出來(lái)。
按照外鍵映射:
擁有外鍵的一端生成主鍵的方式要注意,不是使用 native ,而是使用 foreign
?
示例:
實(shí)體類按照主鍵映射的一樣,區(qū)別在于映射文件。這里將映射文件代碼貼出來(lái)。
Department類的映射文件
<class name="com.zcd.hibernate.oneToOnePrimary.Department" table="DEPARTMENT"><id name="id" type="java.lang.Integer"><column name="ID" /><generator class="foreign" > <!-- 生成主鍵的方式 --><param name="property">manager</param> <!-- 還要指定根據(jù)。。。 --></generator></id><property name="name" type="java.lang.String"><column name="NAME" /></property><one-to-one name="manager" class="com.zcd.hibernate.oneToOnePrimary.Manager" constrained="true"></one-to-one></class>?
Manager的映射文件
<class name="com.zcd.hibernate.oneToOnePrimary.Manager" table="MANAGER"><id name="id" type="java.lang.Integer"><column name="ID" /><generator class="native" /></id><property name="name" type="java.lang.String"><column name="NAME" /></property><one-to-one name="department" class="com.zcd.hibernate.oneToOnePrimary.Department"></one-to-one></class>不管先插入哪一個(gè)對(duì)象,都會(huì)先發(fā)送被拿主鍵來(lái)作為他人外鍵的那個(gè)對(duì)象的插入SQL語(yǔ)句,比如這里不管先插入Department 還是Manager,都會(huì)先發(fā)送插入Manager 的SQL語(yǔ)句。
?
?
有一個(gè)疑問:下面的代碼為什么會(huì)保存兩次 Manager 對(duì)象呢?
@Testpublic void testDepartmentAndManager(){Department department = new Department();department.setName("研發(fā)部");Manager manager = new Manager();manager.setName("BB");department.setManager(manager);manager.setDepartment(department);oneToOnePrimaryService.saveDepartment(department);oneToOnePrimaryService.saveManager(manager);}?
Hibernate 一對(duì)一關(guān)聯(lián)關(guān)系,使用外鍵映射和使用主鍵映射的區(qū)別:
目前發(fā)現(xiàn)的一點(diǎn)區(qū)別如下,以后發(fā)現(xiàn)了在進(jìn)行添加。
?
| ? | 外鍵映射 | 主鍵映射 |
| 生成主鍵方式 | 使用native ? <generator class="native" />? | 使用foreign還有 <generator class="foreign" ><param name="property">company</param> </generator>? |
| ? | ?使用many-to-one?加上unique屬性,另一端不需要修改,按自動(dòng)生成的使用 | ?使用one-to-one,加上contrained="true"屬性,另一端不需要修改,按自動(dòng)生成的使用 |
轉(zhuǎn)載于:https://www.cnblogs.com/GooPolaris/p/7919416.html
總結(jié)
以上是生活随笔為你收集整理的Hibernate 一对一关联关系的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Makefile的伪目标
- 下一篇: android设备局域网中快速搜索之cl