我已尝试省略 @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
。
我的配置:
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
指定一个类,其实例存储为拥有实体的内在部分并共享实体的标识。嵌入对象的每个持久属性或字段都映射到实体的数据库表。
答案 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
映射。但在这种情况下,实体将被写入单独的表格(而在嵌入的情况下,它可以写入数据库中的单独表格。)