第十章 基於Annotation的關係映射 一對一
如果下麵部分內容有不明白的可以查找:
基於Annotation的關係映射 前期準備:https://blog.csdn.net/p_3er/article/details/9061911
基於映射文件共享主鍵方式實現一對一:https://blog.csdn.net/p_3er/article/details/9004419
基於映射文件唯一外鍵式實現一對一:https://blog.csdn.net/p_3er/article/details/9004471
1、共享主鍵方式:
Person:
@Entity
@Table(name = "person", catalog = "hibernate")
public class Person implements java.io.Serializable {
private Integer id;
private String name;
private IdCard idCard;
public Person() {
}
@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "name", nullable = false, length = 45)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn // 這個注解隻能寫在主(生成ID)的一端,指向從表
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
}
}
IdCard:
@Entity
@Table(name = "id_card", catalog = "hibernate")
public class IdCard implements java.io.Serializable {
private Integer id;
private Person person;
private String cardNo;
public IdCard() {
}
@Id
@GenericGenerator(name = "abc", strategy = "foreign", parameters = { @Parameter(name = "property", value = "person") })
@GeneratedValue(generator = "abc")
@Column(name = "id", unique = true, nullable = false)
/*
與映射文件相比較:
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator >
<param name="property">person</param>
</generator>
</id>
*/
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
public Person getPerson() {
return this.person;
}
public void setPerson(Person person) {
this.person = person;
}
@Column(name = "card_no", nullable = false, length = 45)
public String getCardNo() {
return this.cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
}
測試與使用和基於映射文件基本一樣:https://blog.csdn.net/p_3er/article/details/9004419
2、唯一外鍵方式
Person:
@Entity
@Table(name = "person", catalog = "hibernate")
public class Person implements java.io.Serializable {
private Integer id;
private String name;
private IdCard idCard;
public Person() {
}
@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name = "name", nullable = false, length = 45)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@OneToOne(cascade = CascadeType.ALL,mappedBy="person")
//<one-to-one name="idCard" property-ref="person"/> 與之前的映射文件比較
//當指定person中的mappedBy後,關係隻能被idcard來主動維護
public IdCard getIdCard() {
return idCard;
}
public void setIdCard(IdCard idCard) {
this.idCard = idCard;
}
}
IdCard:
@Entity
@Table(name = "id_card", catalog = "hibernate")
public class IdCard implements java.io.Serializable {
private Integer id;
private Person person;
private String cardNo;
public IdCard() {
}
@Id
@GeneratedValue
@Column(name = "id", unique = true, nullable = false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "person_id", unique = true)
/*
比較:
<many-to-one name="person" column="person_id" unique="true" />
*/
public Person getPerson() {
return this.person;
}
public void setPerson(Person person) {
this.person = person;
}
@Column(name = "card_no", nullable = false, length = 45)
public String getCardNo() {
return this.cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
}
最後更新:2017-04-03 18:52:11