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中有单独的表,其中它们的独立存在是没有意义的.在这些情况下,我们将该类标记为可嵌入.
通常,可嵌入类与嵌入它们的实体共享相同的表
kos*_*tja 18
实体具有身份并可以查询.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;
}
}
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)
| 归档时间: |
|
| 查看次数: |
30569 次 |
| 最近记录: |