例如:外键在哪边那么哪边就是 维护关联关系。至于是哪个主控方,那么就是看使用哪张表到哪张表,比如单向多对一就是多的一方主控,单向一对多就是一的一方主控,但是外键都在多的一方。
现假设有Person表和Address表,是一对一的关系,在Person中有一个指向Address表主键的字段addressID,所以主控方一定是Person,所谓主控方就是能改变关联关系的一方,Person只要改变addressID就改变了关联关系,所以Person是主控方,所以@JoinColumn写在Person类中
Departmant 部门
@Table(name="JPA_Department")
@Entity
public class Department{
private Integer id;
private String departName
private Manager mgr;
@Id
@GeneratedValue
public Integer getId(){
return id;
}
// 使用@OneToOne映射关联关系,若需要在当前数据表中加主键则需要使用@JoinColun进行映射
//注意:1-1关联关系所以需要添加unique=true
//
@JoinColumn(name="MGR_ID",unique=true)
@OneToOne
public String getDepartName() {
return departName;
}
public Manager getMgr() {
return mgr;
}
}
Manager经理
@Table(name="JPA_Manager")
@Entity
public class Manager{
private Integer id;
private String mgrName;
private Department dept;
@Id
@GeneratedValue
public Integer getId(){
return id;
};
public String getMgrName(){
return mgrName;
}
//对于不维护关联关系,没有外键的一方,使用@OneToOne进行映射,建议设置mappedBy
@OneToOne(mappedBy="mgr")
public Department getDept(){
return dept;
}
}
测试
新增 :建议先保存不维护关联关系的一方,即没有外键的一方,这样不会多出来update语句
Manager mgr = new Manager();
mgr.setMgrName("M-AA");
Department dept = new Deptment();
dept.setDepartmentName("D-AA");
设置关联关系
mgr.setDept(detp);
dept.setMgr(mgr);
//保存
entityManager.persist(mgr);
entityManager.persist(dept);
***************************************************
查找
默认情况,若获取维护关联关系的一方,会通过左外关联获取,可以通通过@OneToOne的fetch属性修改加载策略。
Department dept = new Department();
Systou.out.println(dept.getDeptName());
System.out.println(detp.getMgr().getClass().getName());
默认情况,若获取不维护关联关系的一方,会通过左外关联获取,可以通通过@OneToOne的fetch属性修改加载策略。但是依然会在发送sql语句初始化关联关系对象。
这样说明不维护关系的一方,不建议修改fetch属性
Manager mgr = new Manager();
Systou.out.println(mgr.getMgrName());
Systou.out.println(mgr.getDept().getClass().getName());