JPA OneToOne澄清

时间:2010-09-26 15:53:43

标签: hibernate orm jpa jpa-2.0

我正在阅读this本书。在解释“@OneToOne unidirectional”时,作者采用了以下CustomerAddress示例:

@Entity
public class Customer{
   @Id @GeneratedValue
   private Long id;
   private String name;
   private Address address;
   //few other columns, getters/setters
}

@Entity
public class Address{
   @Id @GeneratedValue
   private Long id;
   private String city;
   //few other columns, getters/setters

}

并且说 -

  • 这是最低要求 annotaions。
  • 没有@OneToOne注释 需要的。(因为,默认情况下, 坚持提供者将承担它)
  • @JoinColumn注释允许您 自定义外来的映射 键。如下图所示,我们可以重新命名 ADD_FK的外键列

然后关于这个:

@Entity
public class Customer {    
    @Id    @GeneratedValue    
    private Long id;      
    private String name;    
    @OneToOne       
    @JoinColumn(name="ADD_FK")    
    private Address address;    
    //few other    columns, getters/setters 
}

@Entity
public class Order {   
    ....       
    List<OrderLine> orderLines;   
    ... 
}
  • 默认情况下,OneToMany关系是 什么时候收集一个 正在使用实体类型。

我的问题:

  1. 以上陈述是否有效?因为当我在Hibernate上尝试这些例子时,我得到了例外。

  2. 这些陈述是否按照JPA制定 标准

  3. 或者是Hibernate是 实施方式不同?
  4. 请澄清。

1 个答案:

答案 0 :(得分:4)

据我所知,实体之间的关系必须显式映射。从JPA 1.0规范(粗体是我的):

  

2.1.7实体关系

     

实体之间的关系可能是   一对一,一对多,多对一,   或多对多。关系是   多态的。

     

如果两者之间存在关联   实体,以下之一   关系建模注释   必须应用于相应的持久属性或   引用实体的字段:   OneToOneOneToManyManyToOne,   ManyToMany。对于那些做的协会   不指定目标类型(例如,   其中未使用Java泛型类型   对于收藏品),有必要   指定作为目标的实体   关系。

     

(...)

这在JPA 2.0中没有改变。

因此我注释了实体之间的关系。而AFAIK,Hibernate确实会抱怨在不这样做时无法坚持复杂类型。

但除非有人能告诉我规范的相关部分,否则我认为这种行为是正确的。

参考

  • JPA 1.0规范
    • 第2.1.7节“实体关系”
  • JPA 2.0规范
    • 第2.9节“实体关系”