- //初始化
- User user = new User();
- UserMore more = new UserMore();
- //设置关联关系
- user.setMore(more);
- more.setUser(user);
- //持久化
- session.save(user);
二、具体配置
- public class User
- {
- @OneToOne (fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false )
- @PrimaryKeyJoinColumn
- private UserMore more;
- //其余属性...
- }
- public class UserMore
- {
- @Id
- @GeneratedValue (generator = "pkGenerator" )
- @GenericGenerator (
- name = "pkGenerator" ,
- strategy = "foreign" ,
- parameters = @Parameter (name = "property" , value = "user" )
- )
- private String id;
- @OneToOne (fetch = FetchType.LAZY)
- @PrimaryKeyJoinColumn
- private User user;
- //其余属性...
- }
三、具体说明
1.@PrimaryKeyJoinColumn
告诉hibernate使用主键作为关联字段 大体相当于@JoinColumn(name="id")
可能是由于官方文档写得不清楚 发现有人以为这个注解是用来指定另一端的主键生成方式
发现没达到目的后 就认为这个JPA的一个BUG
这个理解的错误的 其实JPA本身根本就不支持共享主键的"主键"生成方式
需要手动来同步主键 好在hibernate提供了一个扩展注解
2.@GenericGenerator(
name = "pkGenerator",
strategy = "foreign",
parameters = @Parameter(name = "property", value = "user")
)
这段注解的意思是 使用当前对象中user属性的主键来作为本对象的主键(有点绕口啊 理解万岁吧...)
3.@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false)
optional很重要 指定关联属性不能为空
如果想要实现延迟加载就一定要将这个属性设置为false
这是因为JPA需要知道对应的数据是否存在后 才能决定是创建一个"延迟代理"还是"null引用"
所以就不得不发起一条SQL请求来验证