繁体   English   中英

@Entity和@embeddable有什么区别

[英]What is difference between @Entity and @embeddable

@entity和@embeddable注释在类声明之前添加每个注释时的区别?

  1. 第一个创建类作为实体,第二个插入列来自另一个表?
  2. 第一个创建类作为表,而第二个是嵌入另一个类?
  3. 第一个将标准设置为类,第二个定义表类型
  4. 该类的第一个创建表,第二个将一些东西嵌入到不同的类中
  5. 第一个定义表属性,第二个创建两个表的并集

对类的@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中有单独的表,它们的独立存在是没有意义的。 在这些情况下,我们将该类标记为可嵌入。

通常,可嵌入类与嵌入它们的实体共享相同的表

实体具有身份并可以查询。 Embeddables没有自己的身份,只能查询使用拥有实体。

如果您打开实体类,您将始终找到@Id注释 - 它是必需的。 如果你打开一个可嵌入的类,你永远不会找到@Id注释 - 它是被禁止的。

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

实体类是普通用户定义的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;
    }
}

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

类比是在这种情况下,如果我们要应用DDD,则Entity是使用@Entity注释的类,而Value Object是具有@Embeddable 这种情况的一个例子是,可嵌入对象作为附加信息添加到现有记录中,现有记录已经在嵌入对象外部定义its own identity

那么@Entity表示实体对象本身具有重要性,它不需要与任何其他对象进一步关联。 由于@Embeddable对象本身并不具有任何重要性,因此它需要与其他对象相关联。

让我们举一个例子,说我有一个Employee对象,它有一个Address Object集合作为其成员变量。 现在,当谈到任何地址时,我们需要告诉它是谁的地址,员工解决的是。 如果我们只是谈论地址它没有任何意义。 希望这能给你两者之间的差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM