第十章 基於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