在类声明之前添加每一个@entity和@embeddable注解之间的区别?@Entity和@embeddable之间有什么区别
- 第一个创建类作为实体,第二个插入列从另一个表?
- 第一个创建类作为表,第二个嵌入另一个类?
- 第一组标准为一类,第二限定表型
- 第一创建表该类,第二嵌入的东西分成不同的类
- 两个表的第一限定表属性,第二创建联合
在类声明之前添加每一个@entity和@embeddable注解之间的区别?@Entity和@embeddable之间有什么区别
@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
注释 - 这是禁止的。
编辑:这是不完全正确的,可嵌入只能存储为父,即在同一个表中的一部分。这仅适用于一对一的关系。您可以在父实体中嵌入对象的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
来识别。第二个不是由身份定义的,这意味着如果所有组成该特定对象的组件都是相同的,那么2个值对象是相同的。
的比喻是,在这种情况下,如果我们采用DDD的Entity
是@Entity
注释的类和Value Object
是一个与@Embeddable
。这是一个事实,即可嵌入对象作为附加信息添加到现有记录中,该记录已经在嵌入对象的外部定义了its own identity
。
可嵌入组件可以拥有自己的数据库表,以防您将它们用作包,集合,列表和映射(1个实体具有多个可嵌入组件实例时的一对多关系)集合的一部分。 – Aladin