Java-JPA@Basic和@Embedded注释
我正在向老师学习JPA 我在理解以下注释时有些困惑:Java-JPA@Basic和@Embedded注释,java,jpa,Java,Jpa,我正在向老师学习JPA 我在理解以下注释时有些困惑: @Basic @嵌入式 可嵌入类型的字段默认为persistent,就像用@Embedded注释一样 如果可嵌入类型的字段默认为persistent,那么为什么我们需要@Embedded注释@Embedded注释允许指定一个类,其实例存储为所属实体的固有部分。此批注没有属性 @Embeddable public class EmploymentPeriod { java.util.Date startDate; jav
@Basic
@嵌入式
如果可嵌入类型的字段默认为persistent,那么为什么我们需要
@Embedded
注释@Embedded
注释允许指定一个类,其实例存储为所属实体的固有部分。此批注没有属性
@Embeddable
public class EmploymentPeriod {
java.util.Date startDate;
java.util.Date endDate;
...
}
@Embedded
注释用于指定值为可嵌入类实例的实体的持久字段或属性。默认情况下,@embeddeble
类中指定的列定义适用于所属实体的表,但是您可以使用@AttributeOverride
覆盖它们:
@Embedded
@AttributeOverrides({
@AttributeOverride(name="startDate", column=@Column(name="EMP_START")),
@AttributeOverride(name="endDate", column=@Column(name="EMP_END"))
})
public EmploymentPeriod getEmploymentPeriod() { ... }
关于可选的
@Basic
注释,您可以使用它将获取类型配置为LAZY
,并使用可选的属性将映射配置为禁止空值(对于非基本类型)
@Basic(fetch=LAZY)
protected String getName() { return name; }
您还可以将其放置在字段或属性上,以明确地将其标记为持久性(用于文档编制)。在ORM映射中,对象模型的粒度可以比数据库的粒度更细
例如,您的数据库中可以有一条Person
记录,该记录可以进一步分解,以包含对模型中地址
对象的引用。这就是@Embedded
和@embeddedable
注释的用武之地。它们只是表示一种关系,其中一个实体可以作为另一个实体的一部分存储
至于@Basic
注释,它是最简单的映射形式,默认情况下应用于int和float等基本类型及其包装器以及枚举。更多信息可在此处查看:
@Basic
基本注释可以应用于持久性属性或
以下任何类型的实例变量:
Java基本类型,
基本类型、字符串、java.math.BigInteger、,
java.math.BigDecimal、java.util.Date、java.util.Calendar、,
java.sql.Date,java.sql.Time,java.sql.Timestamp,字节[],字节[],
char[]、Character[]、enum和实现的任何其他类型
java.io.Serializable
基本注释的使用是可选的
这些类型的持久字段和属性。如果基本
默认情况下,未为此类字段或属性指定注释
将应用基本注释的值
例如:
@Basic
protected String name;
及
@Embedded
指定值为的实体的持久字段或属性
可嵌入类的实例。可嵌入类必须是
注释为可嵌入的
例1:
@Embedded
@AttributeOverrides({
@AttributeOverride(name="startDate", column=@Column("EMP_START")),
@AttributeOverride(name="endDate", column=@Column("EMP_END"))
})
public EmploymentPeriod getEmploymentPeriod() { ... }
例2:
@Entity
public class Project {
@EmbeddedId ProjectId id;
//other fields
}
@Embeddable
Class ProjectId {
int departmentId;
long projectId;
}
和Q1。如果可嵌入类型的字段或属性通过default持久化,那么为什么我们需要添加@Embedded
注释?问题2。我可以使用@AttributeOverrides
注释而不使用@Embedded
注释吗?请你也解释一下@Basic
?Q1。因为@Embedded允许重写列定义Q2。不,我不这么认为。这里有一个很好的例子说明了这一点:@Pascal如果没有覆盖怎么办?@Embedded
的目的是什么?它能被省略吗?@HendyIrawan:我把这个问题作为一个问题贴在这里,这是关于这个问题最有用、最简洁、最完整的答案!;)得到我的+1
@Entity
public class Project {
@EmbeddedId ProjectId id;
//other fields
}
@Embeddable
Class ProjectId {
int departmentId;
long projectId;
}