@Embedded 注释技术和@OneToOne 注释技术有什么区别,因为在 Embedded 中,java 类在类中包含“具有”关系,并且借助 @Embedded 注释,我们将对象保存在数据库中。在 OneToOne 关系中,我们还坚持在数据库中有一个对象。
5 回答
@OneToOne 用于映射两个与一对一关系相关的数据库表。例如,客户可能总是在名称表中有一条记录。
或者,如果这些名称字段在 Customer 表中(而不是在单独的表中),那么您可能需要一个 @embedded。从表面上看,您可以将名称字段作为标准属性添加到 Customer 实体,但如果这些相同的列出现在多个表上(例如,您可能在供应商表上有名称列),它会很有用。
它是组合和聚合之间的区别。@Embedded 对象始终在其父对象的生命周期内进行管理。如果父对象被更新或删除,它们也会被更新或删除。@OneToOne 对象可以通过 @Join 注释的 cascadeType 选项模拟组合,但默认情况下它们是聚合的,也就是它们的生命周期与其父对象的生命周期是分开的。
@Embedded 与值对象(仅在附加到对象时才有意义的对象)一起使用,而一对一映射是在两个具有自己存在和含义的对象之间。
例如
值对象和@Embedded:如果我们有一个用户类并且这个类中有一个地址对象,它可以被认为是一个值对象,因为除非与用户相关联,否则地址本身没有任何意义。这里的地址对象可以用@Embedded注解。
一对一映射和@OneToOne:如果我们有一个用户类并且这个类有一个“父亲”对象或一个“母亲”对象,我们希望将“父亲”或“母亲”实例注释为@OneToOne 为“父亲” ' 或 'Mother' 有自己的意义和存在,并且不是 User 类的 Value 对象。
@OneToMany 和@ElementCollection 之间有一个密切相关的区别。两者都用于在 Java 类中保存 Collection 类型的实例变量。不同之处在于,@ElementCollection 用于保存 Collection 的元素是值对象时,而@OneToMany 用于当元素和对象具有明确定义的含义和存在时。
仅当可以重用字段时才使用@OneToOne。否则,请使用@Embeddable。
引自《Beginning Hibernte》,第 3 版:
在两个实体之间映射一对一关联并没有本质上的错误,其中一个实体不是另一个实体的组成部分(即嵌入到另一个实体中)。然而,这种关系通常有些可疑。在使用 @OneToOne 注释之前,您应该考虑使用前面描述的嵌入式技术。
@Embeddable: 如果实体 (X) 中的字段与另一个实体 (Y) 包含在同一个表中,则实体 X 在休眠术语中称为“组件”或在 JPA 术语中称为“嵌入”。在任何情况下,JPA 或休眠都不允许使用第二张表来存储此类嵌入式实体。
通常,当数据被多个表重用时,我们会考虑对表进行规范化。示例:客户(id, name, street, city, pin, landmark)可以归一化为 Customer(id, name) 和 CustomerAddress(cust_id, street, city, pin, landmark)。在这种情况下,我们可以通过使用 cust_id 将相同的 CustomerAddress 链接到其他表来重用 CustomerAddress。但是,如果您的应用程序不需要这种重用,那么我们可以将所有列保留在一个表中。
所以,一个拇指规则是,
- 如果重用 -> @OneToOne,
- 如果没有重用 -> @Embeddable
@Embedded 通常将复合主键表示为可嵌入类:
@Entity
public class Project {
@EmbeddedId ProjectId id;
:
}
@Embeddable
Class ProjectId {
int departmentId;
long projectId;
}
主键字段在可嵌入类中定义。该实体包含一个使用 @EmbeddedId 注释的主键字段,并包含该可嵌入类的实例。使用此表单时,未定义单独的 ID 类,因为可嵌入类本身可以表示完整的主键值。
@OneToOne 用于映射两个与一对一关系相关的数据库表。@Id 将是主键。