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

我已经尝试省略 @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

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

在使用Hibernate的情况下,如果您注释字段本身(如@Embedded )或注释引用的类(如@Embeddable )则@Embeddable 。 让Hibernate确定类型至少需要两者之一。

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

它说:

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

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