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());

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章