共享主键的@OneToOne关联配置

一、代码使用
Java代码 复制代码
  1. //初始化   
  2. User user = new User();   
  3. UserMore more = new UserMore();   
  4. //设置关联关系   
  5. user.setMore(more);   
  6. more.setUser(user);   
  7. //持久化   
  8. session.save(user);  


二、具体配置
Java代码 复制代码
  1. public class User   
  2. {   
  3.      @OneToOne (fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false )   
  4.      @PrimaryKeyJoinColumn   
  5.      private UserMore more;   
  6.   
  7.      //其余属性...   
  8. }  


Java代码 复制代码
  1. public class UserMore   
  2. {   
  3.      @Id   
  4.      @GeneratedValue (generator = "pkGenerator" )   
  5.      @GenericGenerator (   
  6.          name = "pkGenerator" ,   
  7.          strategy = "foreign" ,   
  8.          parameters = @Parameter (name = "property" , value = "user" )   
  9.      )   
  10.      private String id;   
  11.   
  12.      @OneToOne (fetch = FetchType.LAZY)   
  13.      @PrimaryKeyJoinColumn   
  14.      private User user;   
  15.   
  16.      //其余属性...   
  17. }  



三、具体说明
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请求来验证

转自:http://exceedsun21320070508164500.iteye.com/blog/370806

你可能感兴趣的:(sql,Hibernate,jpa,Blog)