单向关联和双向关联有什么区别?
由于在数据库中生成的表都是相同的,所以我发现的唯一区别是双向关联的每一侧都有一个引用,而单向则没有。
这是单向关联
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的:
Group
User
您将如何访问它们?对于这么多Users,您通常需要应用一些过滤和/或分页,以便无论如何都要执行查询(除非您使用集合过滤,对我来说这看起来像是hack)。在这种情况下,某些开发人员可能倾向于在内存中应用过滤,这显然不利于性能。请注意,具有这种关系可以鼓励这类开发人员在不考虑性能影响的情况下使用它。
您将如何向添加新User的Group?幸运的是,Hibernate在持久化关系时会考虑关系的所有权,因此只能设置User.group。但是,如果要使内存中的对象保持一致,则还需要添加User到Group.users。但这会使Hibernate Group.users从数据库中获取所有元素!
User.group
Group.users
因此,我不同意“最佳实践”中的建议。您需要仔细设计双向关系,同时考虑用例(是否需要双向导航?)和可能的性能影响。