当前位置: 首页 > 面试题库 >

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

公西毅
2023-03-14
问题内容

单向关联和双向关联有什么区别?

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

这是单向关联

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;
}

区别在于该组是否持有用户的参考。

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


问题答案:

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

请注意,导航访问并不总是很好,特别是对于“一对多”和“一对多”关系而言。想象一个Group包含数千个User的:

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

  • 您将如何向添加新UserGroup?幸运的是,Hibernate在持久化关系时会考虑关系的所有权,因此只能设置User.group。但是,如果要使内存中的对象保持一致,则还需要添加UserGroup.users。但这会使Hibernate Group.users从数据库中获取所有元素!

因此,我不同意“最佳实践”中的建议。您需要仔细设计双向关系,同时考虑用例(是否需要双向导航?)和可能的性能影响。



 类似资料:
  • 问题内容: Hibernate中的persist()和merge()有什么区别? 可以创建UPDATE&INSERT查询,例如: 在这种情况下,将生成 查询, 如下所示: 因此方法可以 生成 一个插入和一个更新。 现在: 这是我在数据库中看到的: 现在使用更新记录 这是我在数据库中看到的: 问题答案: JPA规范包含对这些操作的语义的非常精确的描述,比在javadoc中更好: 应用于实体X 的 p

  • 问题内容: 假设我们具有以下实体: 在更新中可以理解,我们需要保持双方的关系如下: 到目前为止一切都很好。问题是,我是否应按以下所述在双方上进行合并,并且避免使用级联进行第二次合并? 还是合并拥有者足够?这些合并是否还应该在Transaction或EJB内部进行?还是在具有分离实体的简单控制器方法上完成它? 问题答案: 问题是,我是否应按以下所述在双方上进行合并,并且避免使用级联进行第二次合并?

  • 问题内容: 但没人回答我的下一个问题。经典的hibernate方法使用和JPA 实现之间有什么区别?我听说此JPA实现使用并像包装器一样工作,这是真的吗? 问题答案: 确实。 JPA只是一个API,允许您从使用的持久层中进行抽象。Hibernate提供了充当接口的实现,它使用与Hibernate 相同的基础方法。 这个想法是,例如,您可以将实现切换到Eclipse Link,而不必更改任何源代码。

  • 问题内容: 我知道JPA 2是一个规范,而Hibernate是ORM的工具。另外,我了解到Hibernate具有比JPA 2更多的功能。但是从实际的角度来看,真正的区别是什么? 我有使用iBatis的经验,现在我想学习Hibernate或JPA2。我拿起Pro JPA2书籍,并且一直指“ JPA提供者”。例如: 如果您认为某个功能应该被标准化,则应该大声疾呼并向您的JPA提供者提出要求 这使我感到

  • 请帮助我理解在哪里使用常规连接以及连接在哪里提取。 例如,如果我们有这两个查询 而且 它们之间有什么区别吗?如果是,何时使用哪一种?