【发布时间】:2013-10-20 22:23:02
【问题描述】:
@Embedded 和 @Embeddable 在 Hibernate 中有什么用?因为我在互联网上找到的每个示例都是在单个表中插入数据,并使用两个不同的类来完成。我的观点是,如果我使用的是单个表,那么我可以映射单个类中的所有列,那么我为什么要使用不同的类。如果我们使用两个不同的表,则存在one-to-one 和one-to-many hibernate 关系。
【问题讨论】:
@Embedded 和 @Embeddable 在 Hibernate 中有什么用?因为我在互联网上找到的每个示例都是在单个表中插入数据,并使用两个不同的类来完成。我的观点是,如果我使用的是单个表,那么我可以映射单个类中的所有列,那么我为什么要使用不同的类。如果我们使用两个不同的表,则存在one-to-one 和one-to-many hibernate 关系。
【问题讨论】:
假设我们有用@entity 注释的员工表,并且员工有地址,所以在这里我不想创建两个表,即员工和地址,我只想创建一个表,即员工而不是地址表,那么我们需要在中声明地址实例Employee 并在 Address 类的顶部添加 @embedable 注释,所以最后我们在单个员工表中获得表employee及其记录和地址记录
【讨论】:
一个实体可以嵌入到另一个实体中。一个实体的属性可以是多个实体的共同属性。在这种情况下,可以有一个可嵌入实体。并且这种可嵌入实体可以嵌入多个实体中。
让我们考虑一个例子。我们有一个Animal 实体,它具有name 和location 属性。现在两个不同的实体Lion 和Elephant 可以通过嵌入Animal 实体来拥有Animal 属性。我们可以覆盖属性。在Animal 实体中有location 属性,在Elephant 中有place 属性。所以在@AttributeOverrides 的帮助下,我们可以像下面这样:
@AttributeOverrides({ @AttributeOverride(name = "location", column = @Column(name = "place")) })
【讨论】:
Hibernate 中有两种类型的对象
1. 值对象
2. 实体
值对象是不能独立存在的对象。以Address 为例。如果你说地址,人们会问这是谁的地址。所以它不能单独存在。
实体对象是像College和Student这样可以独立存在的对象。
因此,对于值对象,首选方法是将它们嵌入到实体对象中。
要回答为什么我们要创建两个不同的类:首先,这是一个 OOPS 概念,您应该在类之间具有松散耦合和高内聚。这意味着您应该仅为特定目的创建类。例如,您的Student 类应该只包含与Student 相关的信息。
第二点是通过创建不同的类可以提高可重用性。
当我们为实体类定义值对象时,我们使用@Embeddable。
当我们在实体类中使用值类型对象时,我们使用@Embedded
【讨论】:
String字段实现org.hibernate.usertype.UserType,是value还是entity?