Hibernate:@Embedded注释技术和@OneToOne注释技术的区别



@Embedded注释技术和@OneToOne注释技术之间的区别是什么,因为在Embedded中,java类在类中包含"Has a"关系,并且在@Embeddedannotation的帮助下,我们将Has a对象持久化到数据库中。在OneToOne关系中,我们还将has对象保存在数据库中。

@OneToOne用于映射与一对一关系相关的两个DB表。例如,"客户"在"名称"表中可能总是有一条记录。

或者,如果这些名称字段在Customer表中(而不是在单独的表中),则可能需要嵌入@。从表面上看,您可以将名称字段作为标准属性添加到Customer实体中,但如果这些相同的列出现在多个表上(例如,您可能在供应商表上有名称列),则会很有用。

这是组合和聚合之间的区别@嵌入对象始终在其父对象的生命周期内进行管理。如果更新或删除了父级,它们也会更新或删除@OneToOne对象可以通过@Join注释的cascadeType选项模拟合成,但默认情况下它们是聚合的,也就是说它们的生命周期与其父对象的生命周期是分开的。

@Embedded与Value Object(只有附加到对象时才有意义的对象)一起使用,而一对一映射是在两个有自己存在和意义的对象之间使用的。

例如

Value Object和@Embedded:如果我们有一个User类,并且这个类中有一个地址Object,那么它可以被视为一个值对象,因为除非与用户关联,否则地址本身没有任何意义。在这里,地址对象可以用@Embedded进行注释。

一对一映射和@OneToOne:如果我们有一个User类,而这个类有一个"Father"对象或"Mother"对象,我们希望将"Father’或"Mother'"实例注释为@OneToOne作为"Father‘或"Motther",它们有自己的意义和存在,而不是User类的Value对象。

@OneToMany和@ElementCollection之间有一个密切相关的区别。两者都用于在Java类中保存Collection类型的实例变量。不同的是,当保存的Collection的元素是Value Objects时,将使用@ElementCollection,而当elment和object具有明确的含义和存在性时,则使用@OneToMany。

仅当字段可以重用时,才使用@OneToOne。否则,选择@Embeddable。

引用Beginning Hibernte,第三版:

在两个实体之间映射一对一的关联并没有本质上的错误另一个的组件(即嵌入其中)。然而,这种关系往往有些可疑。你应该在使用@OneToOne注释之前,请考虑使用前面描述的嵌入式技术。

@可嵌入:如果实体(X)中的字段与另一个实体(Y)包含在同一个表中,则实体X在hibernate术语中被称为"组件",在JPA术语中被"嵌入"。在任何情况下,JPA或hibernate都不允许使用第二个表来存储这样的嵌入式实体。

通常,当数据被多个表重用时,我们会考虑对表进行规范化。示例:客户(id,name,street,city,pin,landmark)可以标准化为客户(id、name)和客户地址(cust_id,street、city、pin,landscape)。在这种情况下,我们可以通过使用cust_id将CustomerAddress与其他表链接来重用CustomerAddress。但是,如果您的应用程序中不需要这种重用,那么我们可以将所有列保留在一个表中

因此,经验法则是,

  • 如果重用->@OneToOne
  • 如果没有重用->@可嵌入

@Embedded通常将复合主键表示为可嵌入类:

@Entity
public class Project {
@EmbeddedId ProjectId id;
:
}
@Embeddable
Class ProjectId {
int departmentId;
long projectId;
}

主键字段是在可嵌入类中定义的。实体包含一个用@EmbeddedId注释的主键字段,并包含该可嵌入类的实例。使用这种形式时,不会定义单独的ID类,因为可嵌入类本身可以表示完整的主键值。

@OneToOne用于映射与一对一关系相关的两个DB表@Id将是主键。

最新更新