Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:@Embedded注释技术和@OneTone注释技术的区别_Java_Hibernate_Jpa_Annotations - Fatal编程技术网

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

Java Hibernate:@Embedded注释技术和@OneTone注释技术的区别,java,hibernate,jpa,annotations,Java,Hibernate,Jpa,Annotations,@Embedded annotation技术和@OneToOne annotation技术之间的区别是什么?因为在嵌入式中,java类在类中包含“Has”关系,并且在@Embedded annotation的帮助下,我们将Has对象持久化到数据库中。在OneToOne关系中,我们还坚持数据库中有一个对象。这是组合和聚合之间的区别@嵌入式对象始终在其父对象的生命周期内进行管理。如果父对象被更新或删除,它们也会被更新或删除@OneToOne对象可以通过其@Join注释的cascadeType选项模拟

@Embedded annotation技术和@OneToOne annotation技术之间的区别是什么?因为在嵌入式中,java类在类中包含“Has”关系,并且在@Embedded annotation的帮助下,我们将Has对象持久化到数据库中。在OneToOne关系中,我们还坚持数据库中有一个对象。

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

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


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

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

@Entity
public class Project {
    @EmbeddedId ProjectId id;
     :
}

@Embeddable
Class ProjectId {
    int departmentId;
    long projectId;
}
主键字段在可嵌入类中定义。该实体包含单个主键字段,该字段用@EmbeddedId注释,并包含该可嵌入类的实例。使用此表单时,不会定义单独的ID类,因为可嵌入类本身可以表示完整的主键值


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

@Embedded与值对象(仅当附加到对象时才有意义的对象)一起使用,而一对一映射是在具有自身存在和意义的两个对象之间进行的

例如

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

一对一映射和@OneToOne:如果我们有一个用户类,并且这个类有一个“父”对象或一个“母”对象,那么我们希望将“父”或“母”实例注释为@OneToOne作为“父”或“母”,它们有自己的含义和存在,并且不是用户类的值对象


@OneToMany和@ElementCollection之间有一个密切相关的区别。两者都用于在Java类中保存集合类型的实例变量。不同之处在于,@ElementCollection用于保存的集合元素为值对象时,而@OneToMany用于元素和对象具有明确定义的含义和存在时。

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

从Hibernte开始的引用,第三版:

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

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

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

所以,经验法则是

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