JPA系列七:映射关联关系-双向一对一

矫情吗;* 2022-02-09 10:35 420阅读 0赞

1、创建实体类Department

  1. @Table(name="JPA_DEPARTMENTS")
  2. @Entity
  3. public class Department {
  4. private Integer id;
  5. private String deptName;
  6. private Manager mgr;
  7. @GeneratedValue
  8. @Id
  9. public Integer getId() {
  10. return id;
  11. }
  12. public void setId(Integer id) {
  13. this.id = id;
  14. }
  15. @Column(name="DEPT_NAME")
  16. public String getDeptName() {
  17. return deptName;
  18. }
  19. public void setDeptName(String deptName) {
  20. this.deptName = deptName;
  21. }
  22. //使用 @OneToOne 来映射一对一关联关系。
  23. //若需要在当前数据表中添加主键则需要使用 @JoinColumn 来进行映射. 注意, 一对一关联关系, 所以需要添加 unique=true
  24. @JoinColumn(name="MGR_ID", unique=true)
  25. @OneToOne(fetch=FetchType.LAZY)
  26. public Manager getMgr() {
  27. return mgr;
  28. }
  29. public void setMgr(Manager mgr) {
  30. this.mgr = mgr;
  31. }
  32. }

2、创建实体类Manager

  1. @Table(name="JPA_MANAGERS")
  2. @Entity
  3. public class Manager {
  4. private Integer id;
  5. private String mgrName;
  6. private Department dept;
  7. @GeneratedValue
  8. @Id
  9. public Integer getId() {
  10. return id;
  11. }
  12. public void setId(Integer id) {
  13. this.id = id;
  14. }
  15. @Column(name="MGR_NAME")
  16. public String getMgrName() {
  17. return mgrName;
  18. }
  19. public void setMgrName(String mgrName) {
  20. this.mgrName = mgrName;
  21. }
  22. //对于不维护关联关系, 没有外键的一方, 使用 @OneToOne 来进行映射, 建议设置 mappedBy 属性指定由谁来维护关联关系
  23. @OneToOne(mappedBy="mgr")
  24. public Department getDept() {
  25. return dept;
  26. }
  27. public void setDept(Department dept) {
  28. this.dept = dept;
  29. }
  30. }

3、在persistence.xml中配置

  1. <!-- 添加持久化类 -->
  2. <class>com.atguigu.jpa.helloworld.Department</class>
  3. <class>com.atguigu.jpa.helloworld.Manager</class>

4、测试:

  1. //双向一对一的关联关系, 建议先保存不维护关联关系的一方, 即没有外键的一方, 这样不会多出 UPDATE 语句.
  2. @Test
  3. public void testOneToOnePersistence(){
  4. Manager mgr = new Manager();
  5. mgr.setMgrName("M-BB");
  6. Department dept = new Department();
  7. dept.setDeptName("D-BB");
  8. //设置关联关系
  9. mgr.setDept(dept);
  10. dept.setMgr(mgr);
  11. //执行保存操作
  12. entityManager.persist(mgr);
  13. entityManager.persist(dept);
  14. }

在这里插入图片描述

  1. //默认情况下, 若获取维护关联关系的一方, 则会通过左外连接获取其关联的对象.
  2. //但可以通过 @OntToOne 的 fetch 属性来修改加载策略.
  3. @Test
  4. public void testOneToOneFind(){
  5. Department dept = entityManager.find(Department.class, 1);
  6. System.out.println(dept.getDeptName());
  7. System.out.println(dept.getMgr().getClass().getName());
  8. }

在这里插入图片描述

  1. //默认情况下, 若获取不维护关联关系的一方, 则也会通过左外连接获取其关联的对象.
  2. //可以通过 @OneToOne 的 fetch 属性来修改加载策略. 但依然会再发送 SQL 语句来初始化其关联的对象
  3. //这说明在不维护关联关系的一方, 不建议修改 fetch 属性.
  4. @Test
  5. public void testOneToOneFind2(){
  6. Manager mgr = entityManager.find(Manager.class, 1);
  7. System.out.println(mgr.getMgrName());
  8. System.out.println(mgr.getDept().getClass().getName());
  9. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,420人围观)

还没有评论,来说两句吧...

相关阅读