@Entity和@embeddable有什么区别

San*_*dav 24 java entity hibernate java-ee

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

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

Saz*_*man 52

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

@Entity
User
  -- long id
  -- String name
  -- String email
     @Embedded
  -- UserDetails userDetail

@Embeddable
UserDetails
  -- Date dateOfBirth
  -- String sex
  -- String address
  -- String maritalStatus
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到没有User,UserDetails没用.

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

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

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

kos*_*tja 18

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

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

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


Mar*_*tin 5

实体类是普通的用户定义的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@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;
    }
}
Run Code Online (Sandbox Code Playgroud)