SpringData专题(十三)-SpringDataJPA一对一关联

网友投稿 734 2022-11-22

SpringData专题(十三)-SpringDataJPA一对一关联

SpringData专题(十三)-SpringDataJPA一对一关联

1.示例分析

我们采用的示例为部门和经理。 部门:公司中的一个部门。 经理:部门中的经理。 假定一个部门对应着一个经理,也是就是一对一的关系

2.表关系建立

3.实体类关系建立以及映射配置

item类

/** * @author bruceliu * @create 2019-07-10 18:59 * @description */@Table(name="JPA_MANAGERS")@Entitypublic class Manager { private Integer id; private String mgrName; private Department dept; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 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=true @OneToOne(mappedBy="mgr",cascade = {CascadeType.PERSIST}) public Department getDept() { return dept; } public void setDept(Department dept) { this.dept = dept; }}

Department类

@Table(name="JPA_DEPARTMENTS")@Entitypublic class Department { private Integer id; private String deptName; private Manager mgr; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) 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.EAGER) public Manager getMgr() { return mgr; } public void setMgr(Manager mgr) { this.mgr = mgr; } @Override public String toString() { return "Department{" + "id=" + id + ", deptName='" + deptName + '\'' + ", mgr=" + mgr + '}'; }}

4.一对一的操作

4.1.保存

/** * @author bruceliu * @create 2019-07-11 12:15 * @description */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = "classpath:applicationContext.xml")public class OneToOneTest { @Autowired ManagerDao managerDao; @Autowired DepartmentDao departmentDao; // 双向 1-1 的关联关系, 建议先保存不维护关联关系的一方, 即没有外键的一方, 这样不会多出 UPDATE 语句. @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); // 执行保存操作 managerDao.save(mgr); departmentDao.save(dept); }}

4.2.查询

/** * @author bruceliu * @create 2019-07-11 12:15 * @description */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = "classpath:applicationContext.xml")public class OneToOneTest { @Autowired ManagerDao managerDao; @Autowired DepartmentDao departmentDao; // 1.默认情况下, 若获取维护关联关系的一方, 则会通过左外连接获取其关联的对象. // 但可以通过 @OntToOne 的 fetch 属性来修改加载策略. @Test public void testOneToOneFind() { Department dept = departmentDao.findOne(2); System.out.println(dept); System.out.println(dept.getDeptName()); System.out.println(dept.getMgr().getClass().getName()); } // 1. 默认情况下, 若获取不维护关联关系的一方, 则也会通过左外连接获取其关联的对象. // 可以通过 @OneToOne 的 fetch 属性来修改加载策略. 但依然会再发送 SQL 语句来初始化其关联的对象 // 这说明在不维护关联关系的一方, 不建议修改 fetch 属性. @Test public void testOneToOneFind2() { Manager mgr = managerDao.findOne(4); System.out.println(mgr.getMgrName()); System.out.println(mgr.getDept().getClass().getName()); }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《Activiti工作流框架》专题(九)-Activiti工作流框架-整合Spring
下一篇:《SpringCloud Alibaba 微服务架构》专题(二十三)-Seat工作原理
相关文章

 发表评论

暂时没有评论,来抢沙发吧~