2014-01-15 294 views
6

在类声明之前添加每一个@entity和@embeddable注解之间的区别?@Entity和@embeddable之间有什么区别

  1. 第一个创建类作为实体,第二个插入列从另一个表?
  2. 第一个创建类作为表,第二个嵌入另一个类?
  3. 第一组标准为一类,第二限定表型
  4. 第一创建表该类,第二嵌入的东西分成不同的类
  5. 两个表的第一限定表属性,第二创建联合

回答

16

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

通常,嵌入类共享同一个表作为在它们被嵌入

+0

可嵌入组件可以拥有自己的数据库表,以防您将它们用作包,集合,列表和映射(1个实体具有多个可嵌入组件实例时的一对多关系)集合的一部分。 – Aladin

7

实体拥有身份和可被查询的实体。 Embeddables没有自己的身份,只能使用拥有实体进行查询。

如果您打开一个实体类,您将始终找到@Id注释 - 这是强制性的。如果您打开一个嵌入式课程,您将永远找不到@Id注释 - 这是禁止的。

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

2

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

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

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

相关问题