Java 在Hibernate中,合成是如何工作的?
我试图在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
@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
等。