Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 单向和双向JPA与Hibernate关联之间的区别是什么?_Java_Hibernate_Jpa_Orm_Associations - Fatal编程技术网

Java 单向和双向JPA与Hibernate关联之间的区别是什么?

Java 单向和双向JPA与Hibernate关联之间的区别是什么?,java,hibernate,jpa,orm,associations,Java,Hibernate,Jpa,Orm,Associations,单向关联和双向关联之间有什么区别 由于db中生成的表都是相同的,所以我发现唯一的区别是双向关联的每一侧都有一个指向另一侧的引用,而单向关联则没有 这是一种单向关联 public class User { private int id; private String name; @ManyToOne @JoinColumn( name = "groupId") private Group group; } public

单向关联和双向关联之间有什么区别

由于db中生成的表都是相同的,所以我发现唯一的区别是双向关联的每一侧都有一个指向另一侧的引用,而单向关联则没有

这是一种单向关联

public class User {
    private int     id;
    private String  name;
    @ManyToOne
    @JoinColumn(
            name = "groupId")
    private Group   group;
}

public class Group {
    private int     id;
    private String  name;
}
public class User {
    private int     id;
    private String  name;
    @ManyToOne
    @JoinColumn(
            name = "groupId")
    private Group   group;
}
public class Group {
    private int         id;
    private String      name;
    @OneToMany(mappedBy="group")
    private List<User>  users;
}
双向关联

public class User {
    private int     id;
    private String  name;
    @ManyToOne
    @JoinColumn(
            name = "groupId")
    private Group   group;
}

public class Group {
    private int     id;
    private String  name;
}
public class User {
    private int     id;
    private String  name;
    @ManyToOne
    @JoinColumn(
            name = "groupId")
    private Group   group;
}
public class Group {
    private int         id;
    private String      name;
    @OneToMany(mappedBy="group")
    private List<User>  users;
}
公共类用户{
私有int-id;
私有字符串名称;
@许多酮
@连接柱(
name=“groupId”)
私人集团;
}
公共课组{
私有int-id;
私有字符串名称;
@OneToMany(mappedBy=“集团”)
私人名单用户;
}
区别在于组是否持有用户的引用


所以我想知道这是否是唯一的区别?推荐哪一种?

我不是100%确定这是唯一的区别,但这是主要区别。还建议Hibernate文档具有双向关联:

具体而言:

首选双向关联: 单向关联更难查询。大量 应用程序,几乎所有协会 必须能在两个方向上航行 在查询中


我个人对这一笼统的建议有一个小小的问题——在我看来,有些情况下,孩子没有任何实际的理由去了解他们的父母(例如,为什么一个订单项目需要知道它与之相关的订单?),但我也看到了它在合理的时间段内的价值。而且,由于双向性并没有真正伤害到任何东西,因此我不觉得坚持它太令人反感。

主要区别在于双向关系提供了双向导航访问,因此您可以访问另一端而无需显式查询。它还允许您将级联选项应用于两个方向

请注意,导航访问并不总是好的,特别是对于“一对多”和“多对多”关系。想象一个
包含数千名
用户
s:

  • 您将如何访问它们?由于有如此多的
    用户
    s,您通常需要应用一些过滤和/或分页,因此您无论如何都需要执行查询(除非您使用,这对我来说像是一个黑客)。在这种情况下,一些开发人员可能倾向于在内存中应用过滤,这显然不利于性能。请注意,建立这样的关系可以鼓励此类开发人员在不考虑性能影响的情况下使用它

  • 如何将新的
    用户添加到
    ?幸运的是,Hibernate在持久化关系时会查看关系的拥有方,因此您只能设置
    User.group
    。但是,如果要保持内存中对象的一致性,还需要将
    User
    添加到
    Group.users
    。但是它会让Hibernate从数据库中获取
    Group.users
    的所有元素

所以,我不能同意来自政府的建议。您需要仔细设计双向关系,考虑用例(是否需要双向导航访问?)和可能的性能影响

另请参见:


就编码而言,双向关系的实现更加复杂,因为应用程序负责根据JPA规范5(第42页)保持双方同步。不幸的是,规范中给出的示例没有给出更多细节,因此没有给出复杂性级别的概念

当不使用二级缓存时,由于实例在事务结束时被丢弃,因此没有正确实现关系方法通常不是问题

当使用二级缓存时,如果任何内容由于错误实现的关系处理方法而损坏,这意味着其他事务也会看到损坏的元素(二级缓存是全局的)


正确实现的双向关系可以使查询和代码更简单,但如果它在业务逻辑方面没有真正意义,就不应该使用它。

有两个主要区别

访问协会双方 第一个问题与您将如何访问关系有关。对于单向关联,只能从一端导航关联

因此,对于单向
@manytone
关联,这意味着您只能从外键所在的子端访问关系

如果您具有单向的
@OneToMany
关联,则意味着您只能从管理外键的父端访问该关系

对于双向
@OneToMany
关联,您可以从父端或子端以两种方式导航关联

你也需要这样做

演出 第二个方面与性能有关

  • 对于
    @OneToMany
  • 对于
    @OneToOne
  • 对于
    @manytomy

  • 该组现在将知道它包含哪些用户。我不认为这是一个微小的区别。双向关系在更新方面对我来说是一个混乱你好,谢谢,看来你是个冬眠专家,因为你已经回答了我的问题:。现在我不确定关系是否成立,因为我无法在评论中写更多内容,所以我将其发布在这里。如果可能,请检查一下。@hguser:如果您最终决定使您的关系双向,我认为最好从
    addUser()调用
    setGroup()
    以保持两边一致。如果我