シーン
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に1つのマッピングに双方向のいずれかを達成します。
たとえば、部門のマネージャーは、1つの関係に双方向の一つです。
注意:
ブログのホーム・ページ:
https://blog.csdn.net/badao_liumang_qizhi
の社会的関心番号
猿の横柄プログラム
買収関連のプログラミング電子書籍、チュートリアル、無料ダウンロードのためにプッシュ。
実現
1人の関係、新しい経営者や部門のデータベーステーブルと2つのエンティティクラスに双方向の1を構築するために。
新しいデータベース・マネージャーのテーブルテーブルJPA_MANAGERS
設計部門テーブルJPA_DEPARTMENTS
部門のような、新しい部門のエンティティ
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 语句。
运行单元测试方法后查看数据库表
经理表
部门表