OneToOne主键关联
首先来看表的关系:
表1:
Husband
husband_id<<pk>>
name
表2
Wife
wife_id <<pk>><<fk>>
name
Husband类
@Entitypublic class Husband {@Id@GeneratedValueprivate int id;private String name;@OneToOne(cascade = CascadeType.ALL)@PrimaryKeyJoinColumnprivate Wife wife;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Wife getWife() {return wife;}public void setWife(Wife wife) {this.wife = wife;}}?
Wife类
@Entitypublic class Wife {@Id@GeneratedValue(generator = "myForeignGenerator")@org.hibernate.annotations.GenericGenerator(name = "myForeignGenerator", strategy = "foreign", parameters = @Parameter(name = "property", value = "husband"))private int id;private String name;@OneToOne(optional = false, cascade = CascadeType.ALL)@PrimaryKeyJoinColumnprivate Husband husband;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Husband getHusband() {return husband;}public void setHusband(Husband husband) {this.husband = husband;}}?
wife类中的
@Id
?@GeneratedValue(generator = "myForeignGenerator")
?@org.hibernate.annotations.GenericGenerator(name = "myForeignGenerator", strategy = "foreign", parameters = @Parameter(name = "property", value = "husband"))
?private int id;
?
定义了外键的生成策略,这样可以在级联插入时保持husband的主键和wife的外键(也是主键)相同。
?
@Testpublic void testOneToOnePK() {OneToOne.PK.Husband husband = new OneToOne.PK.Husband();OneToOne.PK.Wife wife = new OneToOne.PK.Wife();husband.setName("me");wife.setName("mywife");wife.setHusband(husband);session.beginTransaction();session.save(wife);//级联插入husband// session.save(husband);session.getTransaction().commit();}?
?