【问题标题】:Why do we use @Embeddable In Hibernate为什么我们在 Hibernate 中使用 @Embeddable
【发布时间】:2013-10-20 22:23:02
【问题描述】:

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

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这似乎是concretepage.com/hibernate/… 的副阶段。如果是,我认为您应该添加对该文章的引用或以某种方式将其标记为引用。
      【解决方案3】:

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

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

      实体对象是像CollegeStudent这样可以独立存在的对象。

      因此,对于值对象,首选方法是将它们嵌入到实体对象中。

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

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

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

      【讨论】:

      • 现在我了解了创建两个不同类的逻辑,我在想 Embedded 和 Embeddable 仅适用于单个表?或者它可以用于多个表
      • 我从未尝试过,但我相信我们可以使用,因为我看不到它有任何直接伤害
      • 对其他对象的依赖只是一个指标而不是证据。例如,地址可以被重用并建模为一般的实体或组合/聚合。
      • 如果一个类使用两个String字段实现org.hibernate.usertype.UserType,是value还是entity
      • @macemers 使用自定义 UserType 的属性将被视为值类型,特别是“基本”类型。见docs.jboss.org/hibernate/orm/current/userguide/html_single/…
      猜你喜欢
      • 1970-01-01
      • 2010-11-24
      • 2011-02-05
      • 2013-05-06
      • 1970-01-01
      • 2011-04-29
      • 2014-06-20
      • 2017-05-03
      • 2017-10-13
      相关资源
      最近更新 更多