場景 JPA入門簡介與搭建HelloWorld(附代碼下載): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 JPA中實現單向多對一的關聯關係: https://blog.csdn.net/BADAO_LIUM ...
場景
JPA入門簡介與搭建HelloWorld(附代碼下載):
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937
JPA中實現單向多對一的關聯關係:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103511623
JPA中實現單向一對多的關聯關係:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103520083
JPA中實現雙向一對多的關聯關係:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103523564
按照上面的流程實現以上映射關係後,怎樣在JPA中實現雙向一對一的映射關係。
比如部門與經理就是雙向一對一的關係。
註:
博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關註公眾號
霸道的程式猿
獲取編程相關電子書、教程推送與免費下載。
實現
為了構造出雙向一對一的關聯關係,新增經理和部門兩個資料庫表和實體類。
新建資料庫表JPA_MANAGERS經理表
設計部門表JPA_DEPARTMENTS
然後新建部門實體類Department
package com.badao.jpa.helloworld; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Table(name="JPA_DEPARTMENTS") @Entity public class Department { private Integer id; private String deptName; private Manager mgr; @GeneratedValue(strategy = GenerationType.IDENTITY) @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name="DEPT_NAME") public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } //使用 @OneToOne 來映射 1-1 關聯關係。 //若需要在當前數據表中添加主鍵則需要使用 @JoinColumn 來進行映射. 註意, 1-1 關聯關係, 所以需要添加 unique=true @JoinColumn(name="MGR_ID", unique=true) @OneToOne(fetch=FetchType.LAZY) public Manager getMgr() { return mgr; } public void setMgr(Manager mgr) { this.mgr = mgr; } }
註:
1.使用 @OneToOne 來映射 1-1 關聯關係。
2.若需要在當前數據表中添加主鍵則需要使用 @JoinColumn 來進行映射. 註意, 1-1 關聯關係, 所以需要添加 unique=true。
3.這裡是雙向的一對一映射,所以要選擇一方作為維護主要關聯關係的一方添加@JoinColumn(name="MGR_ID", unique=true)
然後再新建經理實體類
package com.badao.jpa.helloworld; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.Table; @Table(name="JPA_MANAGERS") @Entity public class Manager { private Integer id; private String mgrName; private Department dept; @GeneratedValue(strategy = GenerationType.IDENTITY) @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name="MGR_NAME") public String getMgrName() { return mgrName; } public void setMgrName(String mgrName) { this.mgrName = mgrName; } //對於不維護關聯關係, 沒有外鍵的一方, 使用 @OneToOne 來進行映射, 建議設置 mappedBy=另一方外鍵 @OneToOne(mappedBy="mgr") public Department getDept() { return dept; } public void setDept(Department dept) { this.dept = dept; } }
註:
1.對於不維護關聯關係, 沒有外鍵的一方, 使用 @OneToOne 來進行映射, 建議設置 mappedBy=另一方外鍵。
2.因為此方不維護關聯關係,所以直接使用@OneToOne的mappedBy屬性,屬性值對應的是另一方的外鍵屬性名。
然後在配置文件persistence.xml中添加實體類的配置
<class>com.badao.jpa.helloworld.Manager</class> <class>com.badao.jpa.helloworld.Department</class>
添加位置如下
然後編寫單元測試方法
@Test public void testOneToOnePersistence(){ Manager mgr = new Manager(); mgr.setMgrName("M-BB"); Department dept = new Department(); dept.setDeptName("D-BB"); //設置關聯關係 mgr.setDept(dept); dept.setMgr(mgr); //執行保存操作 entityManager.persist(mgr); entityManager.persist(dept); }
註:
雙向 1-1 的關聯關係, 建議先保存不維護關聯關係的一方, 即沒有外鍵的一方, 這樣不會多出 UPDATE 語句。
運行單元測試方法後查看資料庫表
經理表
部門表