【问题标题】:JPA OneToOne clarificationsJPA OneToOne 澄清
【发布时间】:2011-04-17 10:45:00
【问题描述】:

我正在阅读this 的书。关于“@OneToOne 单向”的解释,作者采取了以下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

}

而且是这么说的-

  • 这是最低要求 注释。
  • 没有@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 是 实施方式不同?

请澄清。

【问题讨论】:

    标签: hibernate orm jpa jpa-2.0


    【解决方案1】:

    据我所知,实体之间的关系必须明确映射。来自 JPA 1.0 规范(粗体是我的):

    2.1.7 实体关系

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

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

    (...)

    这在 JPA 2.0 中没有改变。

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

    但除非有人可以向我展示规范的相关部分,否则我认为该行为是正确的。

    参考文献

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-17
      • 2021-09-07
      • 1970-01-01
      • 2023-03-12
      • 2019-11-15
      • 2013-06-05
      • 2013-07-30
      • 1970-01-01
      相关资源
      最近更新 更多