JPA学习笔记(9)——映射双向一对一关联关系

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                       

双向一对一关联关系

一个部门有一个经理,一个经理管一个部门

Department实体类

package com.jpa.helloworld2;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.OneToOne;import javax.persistence.Table;@Table(name="T_DEPARTMENT")@Entitypublic class Department {    @Column(name="ID")    @GeneratedValue    @Id    private Integer id;    @Column(name="DEPT_NAME")    private String deptName;    @JoinColumn(name="MANAGER_ID")    @OneToOne    private Manager manager;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getDeptName() {        return deptName;    }    public void setDeptName(String deptName) {        this.deptName = deptName;    }    public Manager getManager() {        return manager;    }    public void setManager(Manager manager) {        this.manager = manager;    }}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

Manager实体类

package com.jpa.helloworld2;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.OneToOne;import javax.persistence.Table;@Table(name="T_MANAGER")@Entitypublic class Manager {    @Column(name="ID")    @GeneratedValue    @Id    private Integer id;    @Column(name="NAME")    private String name;    @OneToOne(mappedBy="manager")    private Department department;    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Department getDepartment() {        return department;    }    public void setDepartment(Department department) {        this.department = department;    }}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

关于mappedBy的使用,在前面的博客有讲到。

插入

Manager manager = new Manager();manager.setName("mgr1");Department department = new Department();department.setDeptName("deptName1");manager.setDepartment(department);department.setManager(manager);entityManager.persist(manager);entityManager.persist(department);
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

关于插入的顺序,先插入不维护关联关系的一方,即manager(没有外键的一方)

查询

查询维护关联关系的一方(有外键的一方)

Department dept = entityManager.find(Department.class, 1);System.out.println(dept.getDeptName());
   
   
  • 1
  • 2
  • 3

发现执行了两次sql语句,既查询了department,也查询了manager
这里写图片描述

但我们此时只想要department,不想要manager。可以用fetch更改为懒加载策略:

在department实体类中

@OneToOne(fetch=FetchType.LAZY)private Manager manager;
   
   
  • 1
  • 2

查询不维护关联关系的一方(没有外键的一方)

Manager m = entityManager.find(Manager.class, 1);System.out.println(m.getName());
   
   
  • 1
  • 2

运行发现,查询manager时,一定会去查department,即使用fetch改为懒加载策略,结果也是一样的。

不同的时,如果改为懒加载,将会执行两个sql语句查询。默认情况下是执行一句sql语句关联查询。因此不推荐设置fetch

一定会查询两个对象的原因:

  • 在查询manager表时,没有外键,jpa不知道该怎么处理Manager中的关联对象,因此它一定会去department表中查看有没有相应的记录。
  • 在查询department时,因为有外键,所以jpa很容易的知道该怎么处理关联对象:要么返回一个代理,要么返回对象)
           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_43678306/article/details/84104705