java - 单向和双向 JPA 和 Hibernate 关联有什么区别?

标签 java hibernate jpa orm associations

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

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

区别在于组是​​否持有用户的引用。

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

最佳答案

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

请注意,导航访问并不总是好的,尤其是对于“一对多”和“多对多”的关系。想象一个包含数千个 UserGroup:

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

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

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

另请参阅:

关于java - 单向和双向 JPA 和 Hibernate 关联有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5360795/

相关文章:

java - Java中对象的内存消耗是多少?

java - 观察完成后在 View 中显示 AlertDialog

java - Swing框架中适合加载大文件的组件是什么

java - HSQLDB 意外标记 : GETDATE

java - PostgreSQL 函数上的 Hibernate executeUpdate()

java - 如何使用具有相同属性的 Selenium 查找多个不同的 Webelement?

Java 9 : jigsaw and hibernate 5. 2.12 不工作

java - Spring 中基于模式的事务

hibernate - 使用 CockroachDB 的简单 CRUD 应用程序中的 org.hibernate.TransactionException

spring - 如何在配置文件中将刷新模式设置为 "COMMIT"?