一对一双向外键
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