【问题标题】:Embeddable entity with @OneToMany attribute具有@OneToMany 属性的可嵌入实体
【发布时间】:2012-04-10 07:22:24
【问题描述】:

说,我有以下实体:

@Entity
public class A {
  @Id
  @GeneratedValue
  private Long id;

  @Embedded
  private B b;

  //getters and setters
}

@Embeddable
public class B {
  @OneToMany
  private List<C> cList;
  //getters and setters
}

@Entity
public class C {
  @Id
  @GeneratedValue
  private Long id;
  //other fields, getters and setters
}

将模式自动生成功能与Hibernate 一起使用,我得到一个额外的表,其中包含AC 之间的映射。但我想通过将Aid 添加到C 中来实现一对多的关系(例如没有附加表)。

这可能吗?如果是,我应该使用哪些注释来创建这样的映射?

【问题讨论】:

    标签: hibernate jpa-2.0


    【解决方案1】:

    一般来说,@JoinColumn 注释是可能的。它也适用于嵌入式。

    @OneToMany
    @JoinColumn(name="A_ID")
    private List<C> cList;
    

    如果您对嵌入中给出的列的 A_ID 名称不满意,您可以覆盖实体 A 中的列名称:

    @AssociationOverride(name= "cList",
            joinColumns = @JoinColumn(name="SOME_NAME_FOR_JOIN_COLUMN_IN_TABLE_C"))
    @Embedded
    private B b;
    

    【讨论】:

    • 但是我如何指定A_ID是实体A的标识符?
    • 您不必指定,B 中给出的映射是在 A 的上下文中评估的,这就是您的持久性提供者知道它的原因。或者,也许您的意思是如何覆盖连接列名称 - 我添加了示例来回答。
    • 非常感谢!这对我有用。我以为我需要明确告诉持久性提供者从哪个实体获取id,但结果证明它更聪明:)
    猜你喜欢
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 2012-12-06
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    相关资源
    最近更新 更多