JPA @Embedded注释是强制性的吗?

时间:2015-07-01 09:36:29

标签: java java-ee jpa annotations

我已尝试省略 @Embedded注释,但字段已嵌入表格中。我找不到任何可以说@Embedded注释是可选的。

还是不是可选吗?

以下代码

@Embeddable
public class Address {
    String city;
    String street;
}

@Entity
public class Person {
    String name;
    @Embedded // it seems that it works even if this annotation is missing!?
    Address address;
}

始终生成相同的表

person
    name
    city
    street

即使我指定@Embedded

我的配置:

  • JBoss EAP 6.4.0
  • 冬眠-JPA-2.0-API-1.0.1.Final-红帽-3.jar

JPA规范说:

http://docs.oracle.com/javaee/7/api/javax/persistence/Embedded.html

  

@javax.persistence.Embedded

     

指定实体的持久字段或属性,该实体的值是可嵌入类的实例。可嵌入类必须注释为Embeddable。

http://docs.oracle.com/javaee/7/api/javax/persistence/Embeddable.html

  

@javax.persistence.Embeddable

     

指定一个类,其实例存储为拥有实体的内在部分并共享实体的标识。嵌入对象的每个持久属性或字段都映射到实体的数据库表。

2 个答案:

答案 0 :(得分:2)

如果使用Hibernate,那么注释字段本身(如@Embedded)或注释引用的类(如@Embeddable)并不重要。让Hibernate确定类型至少需要两者之一。

在Hibernate文档中有一个(隐含的)声明,请看一下: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/mapping.html#mapping-declaration-component

它说:

  

Person实体有两个组件属性,homeAddress和   出生在。 homeAddress属性尚未注释,但是Hibernate   通过寻找它来猜测它是一个持久的组件   Address类中的@Embeddable注释。

答案 1 :(得分:-1)

Embedded-Embeddable不是强制性的,但它为您提供了实体关系的良好OOP视角。另一种做这种事情的方法是使用OneToOne映射。但在这种情况下,实体将被写入单独的表格(而在嵌入的情况下,它可以写入数据库中的单独表格。)