您的位置:首页 > 其它

hibernate JPA @OneToOne双向关联共享主键

2014-09-19 11:28 1181 查看
之前做项目的时候,老大设计的很多表都是共享主键,当时一下子还不知道要怎么配置。所以今天小试了一下,方便以后参考


1.先写了两个实体Person和PersonExt,主要配置如下:

@Entity

@Table(name = "person")

public class Person implements Serializable{

private Integer id;

private String name;

private Integer age;

private PersonExt personExt;

@Id

@GeneratedValue(generator = "pkGenerator")

@GenericGenerator(name = "pkGenerator", strategy = "native")

@Column(name = "ID", length = 8)

public Integer getId() {

return id;

}

 

@OneToOne(cascade = CascadeType.ALL, mappedBy = "person", fetch = FetchType.LAZY)

public PersonExt getPersonExt() {

return personExt;

}

// 其它setter、getter方法略...

}

 

@Entity

@Table(name = "person_ext")

public class PersonExt implements Serializable{

private Integer id;

private Person person;

private String address;

 

/**

* 本例是双向一对一的共享主键

* 注意事项:

* 1.主表和从表的主键类型要一致,不能主表主键为Integer,从表是String

*/

@Id

@GeneratedValue(generator = "pkGenerator")

@GenericGenerator(

name = "pkGenerator",

strategy = "foreign",

parameters = @Parameter(name = "property", value = "person"))

@Column(name = "ID", nullable = false, unique = true)

public Integer getId() {

return id;

}

 

@OneToOne(fetch = FetchType.LAZY, optional = false)
@PrimaryKeyJoinColumn  // 这个注解不能少。如果不加这个注解,添加扩展信息时,就会自动在person_ext表中增加了一个外键列person_id.

public Person getPerson() {

return person;

}

// 其它setter、getter方法略...

}

 

2.在person表插入了几条数据



 

3.添加人物扩展信息



 

4.得到结果如下:



 

因为1号人物乔峰没有添加扩展信息,所以在person_ext表中没有记录。

由以上可以看得出person表的主键和person_ext表的主键是一一对应的。至此,共享主键设置成功了


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息