Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Hibernate中,合成是如何工作的?_Java_Hibernate_Composition - Fatal编程技术网

Java 在Hibernate中,合成是如何工作的?

Java 在Hibernate中,合成是如何工作的?,java,hibernate,composition,Java,Hibernate,Composition,我试图在hibernate中使用带有注释的组合 我有: @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) {...} publi

我试图在hibernate中使用带有注释的组合

我有:

@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() {...}
}
当我试图拯救福的时候

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

我尝试在工具栏上添加@Entity注释,但这让我:

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


您需要指定
Foo
Bar
之间的关系(使用类似@ManyToOne或@OneToOne的内容)

或者,如果
Bar
不是实体,则用@embeddeble标记它,并将@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() {...}
}

请参阅:——该示例表示@Embedded和@Embedded复合方式,其中
Foo
Bar
Company
ContactPerson
在示例中)映射在同一个表中。

该机制在参考文档的本节中描述:

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

简言之:

如果将类
地址
标记为
@Embedded
,并将
地址
类型的属性添加到类
用户
,将属性标记为
@Embedded
,则生成的数据库表
用户
将具有
地址
指定的所有字段


有关代码,请参见拉尔夫的答案。

每个简单的实体必须标记为一个实体(使用
@entity
),并具有一个标识符(大部分为长标识符)作为主键。必须使用相应的关联注释(
@OneToOne
@OneToMany
@ManyToMany
)声明每个非原始关联/组合。我建议你通读这本书。尝试以下方法使您的代码示例正常工作

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

    @OneToOne
    private Bar bar;

    // getters and setters for id and bar
}

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

    private double x;

    // getters and setters for id and x
}

我正在阅读您发送的链接-我相信它假定我希望规范化表表示。然而,我认为在我的例子中,我更喜欢将这些列嵌入到一个主表中。意思-我想要一个表,其中包含所有Foo&Bar字段作为列。假设这确实是我想要的-我如何使用Hibernate实现这一点?@Ripper234:不,看看示例中的表,它包含Stundent和Address字段。(ER图表有点混乱,因为它显示的是更具逻辑性的视图,而不是数据库。)
@Embedded
@Embedded
不是hibernate注释,它们仅在JPA中可用。你链接到的教程非常糟糕(不仅因为它没有提到它使用JPA),谢谢,我只是缺少了一个@Embedded注释。请编辑您的答案以包含此内容。为了限定我的上述陈述:它们是JPA注释,但显然是标准的hibernate方法(请参见我的答案)。这会创建两个单独的表,但OP希望在foo的表中包含bar字段。@Sean Patrick Floyd不一定如此“组合”指的是Java代码和OOP,而不是数据库映射。OOP组合可以以多种方式映射和存储,包括
@OneToOne
(使用外键)、
@OneToOne
(使用共享主键)、
@Embedded
等。