JPA中实现双向一对一的关联关系
场景
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中实现双向一对一的映射关系。
比如部门与经理就是双向一对一的关系。
注:
博客主页:
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
为了构造出双向一对一的关联关系,新增经理和部门两个数据库表和实体类。
新建数据库表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 语句。
运行单元测试方法后查看数据库表
经理表
部门表
上一篇: 第一个SpringBoot项目