JPA中实现双向一对一的关联关系

2022-10-12,,

场景

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
语句。

运行单元测试方法后查看数据库表

经理表

 

 

部门表

 

 

《JPA中实现双向一对一的关联关系.doc》

下载本文的Word格式文档,以方便收藏与打印。