JPA:双向一对一

例如:外键在哪边那么哪边就是 维护关联关系。至于是哪个主控方,那么就是看使用哪张表到哪张表,比如单向多对一就是多的一方主控,单向一对多就是一的一方主控,但是外键都在多的一方。

现假设有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());

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值