一對一雙向外鍵
1,主控方的配置同一對一單向外鍵關聯。
2,@OneToOne(mappedBy="card") //被控方
@OneToOne(mappedBy="card") //mappedBy所對應的是主控方外鍵屬性的值。
雙向關聯,必須設置mappedBy屬性,因為雙向關聯只能交給一方去控制,不可能在雙方都設置外鍵保存關聯關系,否則雙方都無法保存。
主控方類代碼不用修改:
package oto_bfk; import java.util.Date; import javax.persistence.CascadeType; import javax.persistence.Entity;/*JPA主鍵*/ import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; /*學生實體類*/ @Entity @Table(name="Students",schema="sys") public class Students { private IdCard card;//身份證對象 private int sid; private String gender;//性別 private Date birthday; private String major;//專業 public Students() { } public Students(IdCard card, String gender, Date birthday, String major) { //super(); this.card=card; this.gender = gender; this.birthday = birthday; this.major = major; } @Id @GeneratedValue //主鍵自動增長 public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } @OneToOne(cascade=CascadeType.ALL)//全級聯的級聯關系 @JoinColumn(name="pid",unique=true)//被控類對應的主鍵為pid public IdCard getCard() { return card; } public void setCard(IdCard card) { this.card = card; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } }
被控方的代碼修改如下:
需要注意的是:@OneToOne(mappedBy="card") //mappedBy所對應的是主控方外鍵屬性的值。
package oto_bfk; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.OneToOne; import org.hibernate.annotations.GenericGenerator; /*身份證類*/ @Entity public class IdCard { @Id @GeneratedValue(generator="pid")//指定一個生成器為pid @GenericGenerator(name="pid",strategy="assigned")//構建一個生成器,生成策略strategy為手工賦值 @Column(length=18) private String pid;//身份證號碼 private String sname;//學生姓名 @OneToOne(mappedBy="card") //mappedBy所對應的是主控方外鍵屬性的值。 private Students stu; public IdCard() { } public IdCard(String pid, String sname) { //super(); this.pid = pid; this.sname = sname; } public String getPid() { return pid; } public void setPid(String pid) { this.pid = pid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public Students getStu() { return stu; } public void setStu(Students stu) { this.stu = stu; } }
一對一雙向外鍵聯合主鍵
1,創建主鍵類
2,主鍵類必須實現serialization接口,重寫hashcode()和equals()方法。
主鍵類
@Embeddable
實體類
@EmbeddedId
這個可以參考前面的屬性注解。
http://www.cnblogs.com/alsf/p/7823134.html