關(guān)系映射級別注解
一對一單向外鍵
- @OneToOne(cascade=CascadeType.ALL)
- @JoinColumn(name="pid", unique=true)
@OneToOne(cascade=)
表示級聯(lián)關(guān)系
@JoinColumn(name="pid", unique=true)
表示外鍵關(guān)聯(lián), 對應關(guān)聯(lián)類的列名
這里我們以學生和身份證號為模型,一個身份證號可以唯一的對應一個學生,一個學生有一個唯一的身份證號
@Entity
public class IDCard {
@Id
@GeneratedValue(generator="pid")
@GenericGenerator(name="pid", strategy="assigned")
@Column(length=18)
private String pid; // 身份證號碼
private String sname; // 學生的姓名
}
@Entity
public class Student {
@Id
@GeneratedValue
private int sid;
private Date birthday;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="pid", unique=true)
private IDCard idCard;
}
因為是Student中有一個指向IDCard表主鍵的字段pid,所以主控方是Student,所謂主控方就是能改變關(guān)聯(lián)關(guān)系的一方,Student只要改變pid就改變了關(guān)聯(lián)關(guān)系
一對一雙向外鍵
- 主控方的配置同一對一單向外鍵關(guān)聯(lián)
- @OneToOne(mappedBy="idCard") // 被控方
mappedBy中的屬性是,主控方中外鍵的屬性。
雙向關(guān)聯(lián),必須設置mappedBy屬性。因為雙向關(guān)聯(lián)只能交給一方去控制,不可能在雙方都設置外鍵保存關(guān)聯(lián)關(guān)系,否則雙發(fā)都無法保存。
@Entity
public class IDCard {
@Id
@GeneratedValue(generator="pid")
@GenericGenerator(name="pid", strategy="assigned")
@Column(name = "pid", length=18)
private String pid; // 身份證號碼
private String sname; // 學生的姓名
@OneToOne(mappedBy="idCard")
private Student student;
}
Student和上面一樣沒有任何改變
多對一單向外鍵
多方持有一方的引用, 比如:多個學生對應一個班級
@ManyToOne(cascade={CascadeType.All}, fetch=FetchType.EAGER)
fetch: 抓取策略。
@JoinColumn(name="cid", referencedColumnName="id")
name:多方外鍵的列名
referencedColumnName:一方主鍵的列名
/**
* 教室,一的一方
* @author whyalwaysmea
*/
@Entity
public class ClassRoom {
@Id
@Column(name="id")
@GeneratedValue(generator="cid")
@GenericGenerator(name="cid", strategy="uuid")
private String classRoomId;
private String classRoomName;
}
/**
* 學生類,多的一方
* @author whyalwaysmea
*/
@Entity
public class Student {
@Id
@GeneratedValue
private int sid;
private String sname;
@ManyToOne(cascade= {CascadeType.ALL}, fetch=FetchType.EAGER)
@JoinColumn(name="cid", referencedColumnName="id")
private ClassRoom classRoom;
}
一對多單向外鍵
一方持有多方的集合,一個班級有多個學生
@OneToMany(cascade={CascadeType.All}, fetch=FetchType.LAZY)
@JoinColumn(name="cid")
多對多單向外鍵
學生和教師構(gòu)成多對多的關(guān)聯(lián)關(guān)系
其中一個多方持有另一個多方的集合對象(學生持有教室的集合)
創(chuàng)建中間表
@Entity
public class Teacher {
@Id
@GeneratedValue(generator="tid")
@GenericGenerator(name="tid", strategy="uuid")
private String tid;
private String tname;
}
@Entity
public class Student {
@Id
@GeneratedValue(generator="sid")
@GenericGenerator(name="sid", strategy="uuid")
private String sid;
private String sname;
@ManyToMany
@JoinTable(name = "teachers_students",
inverseJoinColumns = {@JoinColumn(name = "teacherId", referencedColumnName="tid")},
joinColumns = {@JoinColumn(name = "studentId", referencedColumnName="sid")}
)
private Set<Teacher> teachers = new HashSet<>();
}