单向和双向关联有什么区别?
单向和双向关联有什么区别?
由于在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; }
不同之处在于该组是否拥有用户的引用。
所以我想知道这是唯一的区别吗? 这是推荐?
主要区别在于双向关系提供了双向的导航访问,所以你可以在没有明确查询的情况下访问对方。 它也允许你在两个方向上应用级联选项。
请注意,导航访问并不总是很好,特别是对于“一对多”和“多对多”关系。 设想一个包含数千个User
的组:
-
你将如何访问它们? 有了这么多的
User
,你通常需要应用一些过滤和/或分页,所以你需要执行一个查询无论如何(除非你使用收集过滤 ,这看起来像一个黑客)。 有些开发者可能倾向于在这种情况下在内存中应用过滤,这显然不利于性能。 请注意,有这样的关系可以鼓励这种开发者使用它,而不考虑性能影响。 -
你将如何添加新的
User
? 幸运的是,Hibernate在持久化方面看待关系的拥有方,所以你只能设置User.group
。 但是,如果要保持内存中的对象一致,则还需要将User
添加到Group.users
。 但是它会让Hibernate从数据库中获取Group.users
所有元素!
所以,我不能同意最佳实践的build议。 您需要仔细devise双向关系,考虑用例(您是否需要双向导航访问?)以及可能的性能影响。
也可以看看:
- 阻止JPA模型中的“ToMany”关系
- Hibernate映射集合的性能问题
在编码方面,双向关系的实现比较复杂,因为根据JPA规范5(第42页),应用程序负责保持双方同步。 不幸的是,规范中给出的例子并没有给出更多的细节,所以它没有给出关于复杂度的概念。
当不使用二级caching时,通常没有正确实现关系方法的问题,因为事务在事务结束时被丢弃。
当使用二级caching时,如果由于错误地实现了关系处理方法而导致任何内容被破坏,这意味着其他事务也会看到已损坏的元素(二级caching是全局的)。
正确实现的双向关系可以使查询和代码更简单,但是如果在业务逻辑方面没有意义,则不应使用。
我不是100%肯定这是唯一的区别,但它是主要的区别。 还build议通过Hibernate文档进行双向关联:
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/best-practices.html
特别:
更喜欢双向关联:单向关联更难以查询。 在大型应用程序中,几乎所有的关联都必须在查询中双向导航。
我个人对这个毛毯的build议有一个小小的问题 – 在我看来,有些情况下,孩子没有任何实际的理由要知道它的父母(例如,为什么一个订单项目需要知道它的订单与?相关?),但是我确实也看到了它在合理时间内的价值。 而且由于双向性并没有真正地伤害任何东西,所以我不觉得它太反对坚持。