【问题标题】:What is difference between @Entity and @Embeddable@Entity 和 @Embeddable 有什么区别
【发布时间】:2014-02-04 07:01:54
【问题描述】:

@Entity和@Embeddable注解在类声明前各加一个的区别?

  1. 第一个创建类作为实体,第二个插入另一个表的列?
  2. 第一个创建类作为表,而第二个嵌入另一个类?
  3. 第一个将标准设置为一个类,第二个定义表类型
  4. 第一次为该类创建表,第二次将某些内容嵌入到不同的类中
  5. 第一个定义表属性,第二个创建两个表的联合

【问题讨论】:

    标签: java hibernate jakarta-ee entity


    【解决方案1】:

    @Entity 类上的注释定义了它具有明显的独立存在。因此我们可以运行数据库查询,而不依赖于任何其他类。一个类上的@Embeddable 注释定义了它不具有独立存在。因此,如果不依赖其他类,我们就无法运行数据库查询。这是一个更好地理解它的示例:

    @Entity
    User
      -- long id
      -- String name
      -- String email
         @Embedded
      -- UserDetails userDetail
    
    @Embeddable
    UserDetails
      -- Date dateOfBirth
      -- String sex
      -- String address
      -- String maritalStatus
    

    这里你可以看到没有UserUserDetails是没用的。

    通常,在 OOP 中,我们首先设计类,然后设计数据库实体。对于某些类(如上例中的 UserDetails 类),我们不希望在 DB 中有单独的表,它们的独立存在是没有意义的。在这些情况下,我们将类标记为可嵌入的。

    通常,可嵌入类与其嵌入的实体共享同一个表

    【讨论】:

    • 可嵌入组件可以有自己的数据库表,以防您将它们用作集合的一部分,如包、集合、列表和映射(当一个实体有许多可嵌入组件实例时,一对多关系) .
    • 正确的@aladin,不要忘记多对多的重要示例,其连接表具有比两个 FK 更多的属性。那是你必须这样做的时候mkyong.com/hibernate/…
    【解决方案2】:

    实体有一个身份并且可以被查询。 Embeddables 没有自己的身份,只能使用拥有实体进行查询。

    如果你打开一个实体类,你总会找到@Id注解——它是强制性的。如果你打开一个可嵌入的类,你将永远找不到@Id 注释——这是被禁止的。

    编辑:embeddables 只能存储为父级的一部分,即在同一个表中,这并不完全正确。这仅适用于一对一的关系。您可以在父实体中拥有CollectionsMaps 的可嵌入对象,它们将映射到自己的集合表。

    【讨论】:

      【解决方案3】:

      实体类是一个普通的用户定义的Java类,它的实例可以存储在数据库中。

      @Entity
      @Table(name="dog")
      public class Dog{
          @Id
          @Column(name = "id")
          private int id;
      
          @Embedded
          private Animal animal;
          public Dog(int id,Animal animal){
              this.id=id;
              this.animal=animal;
          }
          public int getId() {
              return id;
          }
          public void setId(int id) {
              this.id = id;
          }
          public Animal getAnimal() {
              return animal;
          }
          public void setAnimal(Animal animal) {
              this.animal = animal;
          }
      }
      

      可嵌入类是用户定义的可持久类,用作值类型。与其他非实体类型一样,可嵌入类的实例只能作为嵌入对象存储在数据库中,即作为包含实体对象的一部分。

      @Embeddable
      public class Animal {
      
          @Column(name = "name")
          private String name;
      
          @Column(name = "location")
          private String location;
          public Animal(){
          }
          public Animal(String name,String location){
              this.name=name;
              this.location=location;
          }
          public String getName() {
              return name;
          }
          public void setName(String name) {
              this.name = name;
          }
          public String getLocation() {
              return location;
          }
          public void setLocation(String location) {
              this.location = location;
          }
      }
      

      【讨论】:

        【解决方案4】:

        这是一个老话题,但我想补充一下我的答案,这更多是从理论的角度来看。在 DDD(领域驱动设计)中,我们通常有 EntityValue Objects。第一个只能通过他们拥有的identity 来识别。第二个不是由标识定义的,这意味着如果构成该特定对象的所有组件都相同,那么这两个值对象是相同

        类比是,在这种情况下,如果我们要应用 DDD,Entity 是带有 @Entity 注释的类,Value Object 是带有 @Embeddable 注释的类。可嵌入对象作为附加信息添加到现有记录中的事实证明了这一点,该记录已经在嵌入对象外部定义了its own identity

        【讨论】:

          【解决方案5】:

          @Entity 表示实体对象本身就具有重要意义,它不需要与任何其他对象进一步关联。 @Embeddable 对象本身没有任何意义,它需要与其他对象关联。

          让我们举个例子,假设我有一个员工对象,它有一个地址对象的集合作为其成员变量。现在,当谈到任何地址时,我们需要告诉它是谁的地址,它是哪个员工的地址。如果我们只谈论地址,那没有任何意义。希望这能给您带来两者之间的区别。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-01-15
            • 1970-01-01
            • 2010-12-08
            • 1970-01-01
            • 2010-10-02
            • 2011-12-12
            • 2010-09-16
            相关资源
            最近更新 更多