【问题标题】:Two entity classes with a helper class between them两个实体类,它们之间有一个辅助类
【发布时间】:2015-10-30 10:01:09
【问题描述】:

我在我的项目中使用 JPA 2.0 和 Hibernate。我有一个复杂的场景。

A类和C类对应两个DB表,以1:N的关系链接。然而,在对象模型中,在这两个类之间,存在第三个类 B,它不是 Entity(它是一个 util/helper 类),因此这个帮助类没有对应的数据库中的表。

我的对象模型:

@Entity
public class A {
  @Id
  ... id;

  private B b;
}

public class B {
  private List<C> c;
}

@Entity
public class C {
  ...
}

所以,我想知道如何处理这种情况?

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

    您可以使用Embeddable

    @Entity
    public class A {
      @Id
      ... id;
    
      @Embedded
      private B b;
    }
    
    @Embeddable
    public class B {
      @OneToMany
      private List<C> c;
    }
    
    @Entity
    public class C {
      ...
    }
    

    【讨论】:

    • 谢谢托拜厄斯。在 B 类中,我有一个这样的属性:private Map attributes= new LinkedHashMap()。所以我这样注释这个属性: @OneToMany @MapKey(name="id") 其中'id'是C的主键。所以,当我坚持A时,我有以下错误:ora-00972 标识符太长;因为hibernate会生成这样的查询:插入A_C(A_ID,attributes_C_ID)值(?,?)。实际上 A 和 C 比这些(38 个字符)长,这就是问题所在。我做对了还是做错了什么?
    • 我不明白的是为什么休眠尝试运行这个查询?我的数据库中没有 A_C 表。我在 C 表中有 A id 并停止。
    • 不幸的是,这个问题与您的第一个问题不同 - 在 cmets 部分很难讨论这个问题。您可以创建一个包含所有相关信息的新问题吗?然后,您可以在此处添加新问题的链接。
    • 谢谢托拜厄斯。目前,您的解决方案是完美的。目前我所说的问题不存在,但我可以采取以下stackoverflow.com/questions/9878066/… 但该解决方案对我不利。如果我想将 A 与 C 类型的所有子项保持一致,我该如何注释类?
    • 又是一个新问题,但无论如何:您应该使用@OneToMany(cascade=CascadeType.PERSIST)@OneToMany(cascade=CascadeType.ALL)。它有助于阅读 JPA 文档(尤其是检查所有注释及其属性)。
    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    相关资源
    最近更新 更多