【发布时间】:2014-02-04 07:01:54
【问题描述】:
@Entity和@Embeddable注解在类声明前各加一个的区别?
- 第一个创建类作为实体,第二个插入另一个表的列?
- 第一个创建类作为表,而第二个嵌入另一个类?
- 第一个将标准设置为一个类,第二个定义表类型
- 第一次为该类创建表,第二次将某些内容嵌入到不同的类中
- 第一个定义表属性,第二个创建两个表的联合
【问题讨论】:
标签: java hibernate jakarta-ee entity
@Entity和@Embeddable注解在类声明前各加一个的区别?
【问题讨论】:
标签: java hibernate jakarta-ee entity
@Entity 类上的注释定义了它具有明显的独立存在。因此我们可以运行数据库查询,而不依赖于任何其他类。一个类上的@Embeddable 注释定义了它不具有独立存在。因此,如果不依赖其他类,我们就无法运行数据库查询。这是一个更好地理解它的示例:
@Entity
User
-- long id
-- String name
-- String email
@Embedded
-- UserDetails userDetail
@Embeddable
UserDetails
-- Date dateOfBirth
-- String sex
-- String address
-- String maritalStatus
这里你可以看到没有User,UserDetails是没用的。
通常,在 OOP 中,我们首先设计类,然后设计数据库实体。对于某些类(如上例中的 UserDetails 类),我们不希望在 DB 中有单独的表,它们的独立存在是没有意义的。在这些情况下,我们将类标记为可嵌入的。
通常,可嵌入类与其嵌入的实体共享同一个表
【讨论】:
实体有一个身份并且可以被查询。 Embeddables 没有自己的身份,只能使用拥有实体进行查询。
如果你打开一个实体类,你总会找到@Id注解——它是强制性的。如果你打开一个可嵌入的类,你将永远找不到@Id 注释——这是被禁止的。
编辑:embeddables 只能存储为父级的一部分,即在同一个表中,这并不完全正确。这仅适用于一对一的关系。您可以在父实体中拥有Collections 和Maps 的可嵌入对象,它们将映射到自己的集合表。
【讨论】:
实体类是一个普通的用户定义的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(领域驱动设计)中,我们通常有 Entity 和 Value Objects。第一个只能通过他们拥有的identity 来识别。第二个不是由标识定义的,这意味着如果构成该特定对象的所有组件都相同,那么这两个值对象是相同。
类比是,在这种情况下,如果我们要应用 DDD,Entity 是带有 @Entity 注释的类,Value Object 是带有 @Embeddable 注释的类。可嵌入对象作为附加信息添加到现有记录中的事实证明了这一点,该记录已经在嵌入对象外部定义了its own identity。
【讨论】:
@Entity 表示实体对象本身就具有重要意义,它不需要与任何其他对象进一步关联。 @Embeddable 对象本身没有任何意义,它需要与其他对象关联。
让我们举个例子,假设我有一个员工对象,它有一个地址对象的集合作为其成员变量。现在,当谈到任何地址时,我们需要告诉它是谁的地址,它是哪个员工的地址。如果我们只谈论地址,那没有任何意义。希望这能给您带来两者之间的区别。
【讨论】: