1.在双向的一对一关联中,需要在关系被维护端(inverse side)中的 @OneToOne 注释中指定 mappedBy,
以指定是这一关联中的被维护端。同时需要在关系维护端(owner side)建立外键列指向关系被维护端的主键列。
被维护
/**
* 对于不维护关联关系, 没有外键的一方, 使用 @OneToOne 来进行映射,
* 建议设置 mappedBy=true
*/
@OneToOne(mappedBy="mgr")
public Department getDept() {
return dept;
}
维护端
/**
* 使用 @OneToOne 来映射 1-1 关联关系。
* 若需要在当前数据表中添加主键则需要使用 @JoinColumn 来进行映射.
* 注意, 1-1 关联关系, 所以需要添加 unique=true
*/
@JoinColumn(name="MGR_ID", unique=true)
@OneToOne(fetch=FetchType.LAZY)
public Manager getMgr() {
return mgr;
}
2 test
/**
* 双向 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);
//执行保存操作
entityManager.persist(mgr);
entityManager.persist(dept);
}
/**
* 默认情况下, 若获取维护关联关系的一方, 则会通过左外连接获取其关联的对象.
* 但可以通过 @OntToOne 的 fetch 属性来修改加载策略
*/
@Test
public void testOneToOneFind(){
Department dept = entityManager.find(Department.class, 121);
System.out.println(dept.getDeptName());
System.out.println(dept.getMgr().getClass().getName());
}
/**
* 默认情况下, 若获取不维护关联关系的一方, 则也会通过左外连接获取其关联的对象.
* 可以通过 @OneToOne 的 fetch 属性来修改加载策略. 但依然会再发送
* SQL 语句来初始化其关联的对象
* 这说明在不维护关联关系的一方, 不建议修改 fetch 属性.
*/
@Test
public void testOneToOneFind2(){
Manager mgr = entityManager.find(Manager.class, 1);
System.out.println(mgr.getMgrName());
System.out.println(mgr.getDept().getClass().getName());
}