Java - JPA @Basic和@Embedded注释

Yat*_*oel 34 java jpa

我正在从本教程学习JPA .

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

  • @Basic
  • @Embedded

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

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

Pas*_*ent 51

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

@Embeddable
public class EmploymentPeriod {
     java.util.Date startDate;
     java.util.Date endDate;
     ...
}
Run Code Online (Sandbox Code Playgroud)

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

@Embedded
@AttributeOverrides({
    @AttributeOverride(name="startDate", column=@Column(name="EMP_START")),
    @AttributeOverride(name="endDate", column=@Column(name="EMP_END"))
})
public EmploymentPeriod getEmploymentPeriod() { ... }
Run Code Online (Sandbox Code Playgroud)

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

@Basic(fetch=LAZY)
protected String getName() { return name; }
Run Code Online (Sandbox Code Playgroud)

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

  • Q1.如果embeddable类型的字段或属性是defualt persistent,那么为什么我们需要添加`@Embedded`注释?Q2.我可以使用没有`@ Embedded`注释的`@ AttributeOverrides`注释吗?你能不能对"@ Basic"有所了解吗? (3认同)
  • Q1.因为@Embedded允许覆盖列定义Q2.不,我不这么认为.这里有一个很好的例子说明:http://www.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5.0.0/html/Hibernate_Annotations_Reference_Guide/ch02s02020203.0 (2认同)
  • @Pascal如果没有覆盖怎么办?`@ Embedded`的目的是什么?可以省略吗? (2认同)

Jam*_* P. 13

在ORM映射中,对象模型的粒度可以比数据库的粒度更精细.

例如,您可以Person在数据库中创建一条记录,该记录可以进一步分解,以包含对Address模型中对象的引用.这也正是@Embedded@Embeddable注释进来.他们只是陈述一个地方的关系Entity可以存储为的另一部分.

至于@Basic注释,它是最简单的映射形式,默认情况下应用于原始类型,如int和float及其包装器和枚举.可以在这里获得更多信息:http://docs.jboss.org/hibernate/stable/annotations/reference/en/html/entity.html#entity-mapping-property