Why do we use @Embeddable In Hibernate

63
< p >在Hibernate中,@Embedded@Embeddable有什么用处?因为我在互联网上找到的每个示例都是将数据插入单个表格中,并且要使用两个不同的类来完成。我的观点是,如果我使用单个表格,则可以将所有列映射到单个类中,那么为什么要使用不同的类呢?如果我们使用两个不同的表格,则存在one-to-oneone-to-many Hibernate关系。

3个回答

114

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

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

实体对象可以像学院和学生一样独立存在。

因此,在值对象的情况下,最好的方式是将它们嵌入到实体对象中。

为什么我们要创建两个不同的类呢?首先,这是面向对象编程的概念,应该在类之间保持松散耦合和高内聚性。这意味着您应该只为特定的目的创建类。例如,您的Student类应该只包含与Student相关的信息。

第二点是通过创建不同的类来促进可重用性。

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


现在我理解了创建两个不同类的逻辑,我一直在想嵌入式和可嵌入式只适用于单个表吗?还是可以用于多个表? - NaN
我从未尝试过,但我相信我们可以使用它,因为我没有看到任何直接的危害。 - ankit
1
依赖于其他对象只是一个指示而不是证据。例如,地址可以被重用并作为实体或组合/聚合进行建模。 - Jimmy T.
如果一个类实现了org.hibernate.usertype.UserType接口并包含两个String字段,那么它是“value”还是“entity”? - macemers
@macemers 使用自定义UserType的属性将被视为值类型,具体而言是“基本”类型。请参见https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#categorization-value - Dario Seidl
一个实体可以嵌入到另一个实体中吗? - jaco0646

5
假设我们有一个使用@Entity注释的员工表,而员工具有地址。在这种情况下,我不想创建两个表,即员工表和地址表,我只想创建一个表,即员工表,而不是地址表。那么我们需要在Employee中声明Address实例,并在Address类顶部添加@Embeddable注释。最终,我们将在单个员工表中获取该员工及其地址记录。

-1

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

让我们来看一个例子。我们有一个Animal实体,它具有namelocation属性。现在两个不同的实体LionElephant可以通过嵌入Animal实体来拥有Animal属性。我们可以覆盖这些属性。在Animal实体中有location属性,在Elephant中有place属性。因此,借助于@AttributeOverrides,我们可以像下面这样做:

@AttributeOverrides({ @AttributeOverride(name = "location", column = @Column(name = "place")) })

2
这似乎是对https://www.concretepage.com/hibernate/example-embeddable-embedded-hibernate-annotation的重新表述。如果是,我认为你应该添加对该文章的引用或以某种方式标记它为引文。 - Hervian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接