Java - JPA @Basic和@Embedded注释

时间:2010-04-05 13:14:58

标签: java jpa

我正在从this tutorial学习JPA。

我对理解以下注释有一些困惑:

  • @Basic
  • @Embedded
  

可嵌入类型的字段默认为持久性,就像使用@Embedded一样注释。

如果embeddable类型的字段默认为持久性,那么为什么我们需要@Embedded注释

3 个答案:

答案 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;
}

JSR Persistence SpecificationSource reference