为什么我们在Hibernate中使用@Embeddable

时间:2013-10-13 04:23:28

标签: java hibernate jpa

Hibernate中@Embedded@Embeddable有什么用?因为我在互联网上找到的每个例子都是在一个表中插入数据,并使用两个不同的类来完成。我的观点是,如果我使用单个表,那么我可以映射单个类中的所有列,那么为什么我应该使用不同的类。如果我们使用两个不同的表,那么就有one-to-oneone-to-many休眠关系。

3 个答案:

答案 0 :(得分:73)

Hibernate中有两种类型的对象
1.价值对象
2.实体

值对象是不能独立存在的对象。以Address为例。如果你说地址,人们会问这是谁的地址。所以它不能孤立。

实体对象是那些可以像CollegeStudent一样独立的人。

因此,在值对象的情况下,首选方法是将它们嵌入到实体对象中。

回答为什么我们要创建两个不同的类:首先,它是一个OOPS概念,你应该在类之间具有松耦合和高内聚。这意味着您应该仅为专门目的创建类。例如,您的Student课程应该只包含与Student相关的信息。

第二点是,通过创建不同的类,您可以提升可重用性。

当我们为实体类定义值对象时,我们使用@Embeddable 当我们在实体类中使用值类型对象时,我们使用@Embedded

答案 1 :(得分:0)

一个实体可以嵌入另一个实体。实体的属性可以是多个实体的共同属性。在这种情况下,可以有一个可嵌入的实体。这个可嵌入的实体可以嵌入到多个实体中。

让我们考虑一个例子。我们有一个Animal实体,其中包含namelocation个属性。现在,只需嵌入Lion实体,两个不同的实体ElephantAnimal就可以拥有Animal个属性。我们可以覆盖属性。在Animal实体中,location属性为Elephantplace属性为@AttributeOverrides。因此,在@AttributeOverrides({ @AttributeOverride(name = "location", column = @Column(name = "place")) }) 的帮助下,我们可以执行以下操作:

{{1}}

答案 2 :(得分:0)

假设我们有用@entity注释的employee表,而employee具有Address,所以在这里我不想创建两个表,即employee和address,我只想创建一个表,即employee不是Address表,那么我们需要在其中声明Address实例。 Employee并在Address类的顶部添加@embedable批注,因此最后我们在单个员工表中获得表及其记录和地址记录的表