Java-JPA@Basic和@Embedded注释

Java-JPA@Basic和@Embedded注释,java,jpa,Java,Jpa,我正在向老师学习JPA 我在理解以下注释时有些困惑: @Basic @嵌入式 可嵌入类型的字段默认为persistent,就像用@Embedded注释一样 如果可嵌入类型的字段默认为persistent,那么为什么我们需要@Embedded注释@Embedded注释允许指定一个类,其实例存储为所属实体的固有部分。此批注没有属性 @Embeddable public class EmploymentPeriod { java.util.Date startDate; jav

我正在向老师学习JPA

我在理解以下注释时有些困惑:

  • @Basic
  • @嵌入式
可嵌入类型的字段默认为persistent,就像用@Embedded注释一样


如果可嵌入类型的字段默认为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;
}