JPA - 何时使用关系?

时间:2012-04-09 09:22:19

标签: java jpa

我仍然不是一个对JPA感到完全满意的舞台。

现在我在使用关系注释之间徘徊,或者只是在需要查询时检索相关对象。

例如,我有一个拥有项目的用户。我可以使用onetomany关系并以对象方式检索项目,或者我可以在需要时简单地查询用户的项目。

后一种解决方案涉及更多代码,但不知何故,我有更多的自由和控制我想做的事情,或者至少这是我的印象。前者显然会处理相当多的锅炉板代码,例如创建/删除/更新对象,但在此过程中需要学习一些技巧。

如果有人能够在JPA中使用关系注释,最好根据她/他的经验,可以提出一个简单的经验法则,我将不胜感激。

谢谢,

托马斯

5 个答案:

答案 0 :(得分:1)

基本规则是你应该在需要时创建一个关系。

对于一对一和多对一的关系,这很容易:你几乎总是需要它们。例如,当您显示Project信息时,您几乎总是需要显示其所有者信息,因此在此创建关系是一个不错的选择。

一对多和多对多关系需要更多关注,因为过度使用它们会导致性能问题。

我个人的经验法则如下:如果您不需要一次性显示Project的所有User而不需要分页或过滤(或者至少不需要这样做)经常),不要建立关系。否则你可以创建它(例如,你通常需要同时OrderLine的所有Order,因此在这种情况下你需要一对多的关系。)

答案 1 :(得分:0)

当两个实体之间存在关系且您希望使用它时,请使用JPA关系注释。确切的一个主要优点是,当实体之间存在关系时,不必手动进行额外查询。

答案 2 :(得分:0)

我会去注释。它更简单,产生更少的代码,这是使用JPA的重点。此外,默认情况下,一对多集合也是延迟获取的,因此您不必冒险从数据库中提取您不需要的内容。

但我建议阅读懒惰/渴望提取并了解其运作方式。

答案 3 :(得分:0)

您的问题是有效的,在符合JPA标准的ORM中,关系很难。但是,关系的好处是能够在JPA QL查询中使用它们。例如。当你想要获取用户使用给定名称创建的所有项目时,你可以写:

SELECT p
FROM Project p
WHERE p.user.name = 'Smith'

当代替:

时,你不能这样做
@ManyToOne
private User user

Project关系中你有一个简单的:

private int userId;

还要研究各种提取策略,以便对关系感到更舒服。

答案 4 :(得分:0)

这完全取决于您的应用程序在检索数据及其所需实例方面的工作方式。虽然JPA可以在任何地方使用,甚至可以在Java EE容器之外使用(这在标准Java SE应用程序或Spring等中使用是一个巨大的优势),我发现它的“思维方式”非常依赖于Request - 响应式交互,映射到Web应用程序等(这些公平是目前最流行的企业服务器端应用程序类型)。但是,除非你有一些非常具体的需求,否则我肯定会投资学习JPA关系注释。

在JPA中,一切都围绕着EntityManager会话。如果您有一个EntityManager实例在整个工作流程中管理您的实体,您提到您需要获取用户,项目等的所有内容,所有这些都在一个请求 - 响应中,然后肯定会使用@OneToMany等,因为它将负责让孩子实体,无论何时需要它们而不关心如何加入外键,并且还可以对何时检索内容进行优化。即使您需要在请求中使用相同的实体,使用refresh()merge()也非常简单。

我同意你的看法,注释往往会有点毛茸茸的FetchType,CascadeType等等你可能还会遇到偶尔臭名昭着的cannot simultaneously fetch multiple bags PersistenceException,所以它的颠簸,但是一旦你掌握了我认为值得投资。