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