我正在从this tutorial学习JPA。
我对理解以下注释有一些困惑:
@Basic
@Embedded
可嵌入类型的字段默认为持久性,就像使用@Embedded一样注释。
如果embeddable类型的字段默认为持久性,那么为什么我们需要@Embedded
注释
答案 0 :(得分:50)
@Embeddable
注释允许指定一个类,其实例存储为拥有实体的内在部分。此注释具有无属性。
@Embeddable
public class EmploymentPeriod {
java.util.Date startDate;
java.util.Date endDate;
...
}
@Embedded
注释用于指定实体的持久字段或属性,该实体的值是可嵌入类的实例。默认情况下,@Embeddable
类中指定的列定义适用于拥有实体的表,但使用@AttributeOverride
可以覆盖它们:
@Embedded
@AttributeOverrides({
@AttributeOverride(name="startDate", column=@Column(name="EMP_START")),
@AttributeOverride(name="endDate", column=@Column(name="EMP_END"))
})
public EmploymentPeriod getEmploymentPeriod() { ... }
关于可选的@Basic
注释,您可以使用它将获取类型配置为LAZY
,并使用optional
配置映射以禁止空值(对于非基本类型)属性。
@Basic(fetch=LAZY)
protected String getName() { return name; }
您也可以将它放在字段或属性上,以明确标记为持久性(出于文档目的)。
答案 1 :(得分:12)
在ORM映射中,对象模型的粒度可以比数据库的粒度更精细。
例如,您可以在数据库中拥有Person
记录,可以进一步分解该记录以包含对模型中Address
对象的引用。这就是@Embedded
和@Embeddable
注释的用武之地。它们只是说明一个Entity
可以存储为另一个@Basic
的关系。
对于{{1}}注释,它是最简单的映射形式,默认情况下应用于原始类型,如int和float及其包装器和枚举。可以在此处获得更多信息:http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#entity-mapping-property
答案 2 :(得分:3)
<强> @Basic 强>
Basic注释可以应用于持久属性或 任何以下类型的实例变量:
Java原始类型, 原始类型的包装器,String,java.math.BigInteger, java.math.BigDecimal,java.util.Date,java.util.Calendar, java.sql.Date,java.sql.Time,java.sql.Timestamp,byte [],Byte [], char [],Character [],枚举以及任何其他实现的类型 java.io.Serializable接口。
使用Basic注释是可选的 持久字段和这些类型的属性。如果是基本的 没有为这样的字段或属性指定注释,默认值 基本注释的值将适用。
示例:
@Basic
protected String name;
和
@Basic(fetch=LAZY)
protected String getName() {
return name;
}
<强> @Embedded 强>
指定值为的实体的持久字段或属性 可嵌入类的一个实例。可嵌入的类必须是 注释为Embeddable。
示例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;
}