组合在 Hibernate 中是如何工作的?

rip*_*234 4 java hibernate composition

我正在尝试在带有注释的休眠中使用组合。

我有:

@Entity
@Table(name = "Foo")
public class Foo {
    private Bar bar;

    public void setBar(Bar bar){...}
    public Bar getBar() {...)
}

public class Bar {
  private double x;

  public void setX(double x) {...}
  public double getX() {...}
}
Run Code Online (Sandbox Code Playgroud)

当我试图拯救 Foo 时,我得到了

无法确定表 Foo 中实体 org.bla.Bar 的类型,用于列:[org.hibernate.mapping.Column(bar)]

我尝试在 Bar 上添加 @Entity 注释,但这让我知道:

没有为实体 org.bla.Bar 指定标识符

Ral*_*lph 6

您需要specifiy之间的关系Foo,并Bar(与类似@ManyToOne或者@OneToOne)。

或者,如果Bar不是实体,则用@Embeddable 标记它,并将@Embedded 添加到Foo.

@Entity
@Table(name = "Foo")
public class Foo {
    @Embedded
    private Bar bar;

    public void setBar(Bar bar){...}
    public Bar getBar() {...)
}

@Embeddable
public class Bar {
  private double x;

  public void setX(double x) {...}
  public double getX() {...}
}
Run Code Online (Sandbox Code Playgroud)

请参阅:https ://www.baeldung.com/jpa-embedded-embeddable——该示例解释了@Embeddable 和@Embedded Composite 方式,其中FooBarCompanyContactPerson在示例中)映射在同一个表中。


Sea*_*oyd 5

参考文档的这一部分描述了该机制:

5.1.5. 嵌入对象(又名组件)

显然 hibernate 为此使用了 JPA 注释,因此Ralph 引用的解决方案是正确的

简而言之:

如果您将一个类标记Address@Embeddable并添加一个类型Address为 classUser的属性@Embedded,将该属性标记为,那么生成的数据库表User将包含由Address.

有关代码,请参阅 Ralph 的答案。