jpa注解 - Java-JPA @Basic和@Embedded注释




spring data jpa注解 (2)

我正在从本教程学习JPA。

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

  • @Basic
  • @Embedded

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

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


@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", [email protected]("EMP_START")),
       @AttributeOverride(name="endDate", [email protected]("EMP_END"))    
})        
public EmploymentPeriod getEmploymentPeriod() { ... }

例2:

@Entity
public class Project {
    @EmbeddedId ProjectId id;
    //other fields
}


@Embeddable
Class ProjectId {
    int departmentId;
    long projectId;
}

JSR持久性规范源参考


@Embeddable注释允许指定一个类,其实例存储为拥有实体的内在部分。 此注释没有属性

@Embeddable
public class EmploymentPeriod {
     java.util.Date startDate;
     java.util.Date endDate;
     ...
}

@Embedded批注用于指定实体的持久字段或属性,该实体的值是可嵌入类的实例。 默认情况下, @Embeddable类中指定的列定义适用于拥有实体的表,但您可以使用@AttributeOverride 覆盖它们

@Embedded
@AttributeOverrides({
    @AttributeOverride(name="startDate", [email protected](name="EMP_START")),
    @AttributeOverride(name="endDate", [email protected](name="EMP_END"))
})
public EmploymentPeriod getEmploymentPeriod() { ... }

关于可选的@Basic注释,您可以使用它来将获取类型配置为LAZY并使用optional属性将映射配置为禁止空值(对于非基本类型)。

@Basic(fetch=LAZY)
protected String getName() { return name; }

您还可以将其放在字段或属性上,以将其明确标记为持久性(用于文档目的)。





jpa