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

2022-09-04 04:52:03

我尝试省略注释,并且字段仍然嵌入在表中。我找不到任何会说注释是可选的。@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
  • hibernate-jpa-2.0-api-1.0.1.Final-redhat-3.jar

JPA规范说:

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

@javax.persistence.Embedded

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

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

@javax.persistence.Embeddable

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


答案 1

在使用 Hibernate 的情况下,是注释字段本身(as )还是注释引用的类 (as ) 并不重要。至少需要两者中的一个才能让休眠确定类型。@Embedded@Embeddable

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

它说:

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


答案 2

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


推荐