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