2012-04-09 84 views
0

我仍然不是一个对JPA感到完全舒适的阶段。JPA - 何时使用关系?

现在我在使用关系注释或只是在需要查询时才检索相关对象。

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

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

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

感谢,

托马斯

+0

出于兴趣,您为什么认为在使用JPA或使用其他方法时需要更改模型?你的模型是你的模型。你设计它。然后你决定什么位持续。 – DataNucleus 2012-04-09 10:19:05

+0

我不需要改变我的模型。然而,我给项目给出的例子,在后一种情况下会导致项目拥有一个变量来保存用户的id,即owner = userid。然后,我会通过查询所有者与用户名相匹配的所有项目来检索用户的项目。 – Thomas 2012-04-09 13:29:59

回答

1

基本规则是,您应该在需要时创建关系。

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

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

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

0

当两个实体之间的关系,你希望使用它,使用JPA关系的注解。其中一个主要优势就是在实体之间存在关系时不必手动进行额外查询。

0

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

但我建议阅读懒惰/渴望提取和学习如何工作。

0

您的问题是有效的,在JPA兼容的ORM中,关系很难。然而,关系的好处是可以在JPA QL查询中使用它们。例如。当你想获取用户使用相同的名字创建的所有项目,你可以写:

@ManyToOne 
private User user 
Project关系

你有一个简单:

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

,而不是当你不能做到这一点

private int userId; 

还调查各种取材策略,以感觉更舒适的关系。

0

这一切都取决于您的应用程序如何检索数据及其所需实例。尽管JPA可以在任何地方使用,即使在Java EE容器之外(这对于在标准Java SE应用程序中使用,或者与Spring等一起使用也是一个巨大的优势),我发现它的“思维方式”非常重视Request - 响应式交互,映射到Web应用程序等(这些公平的是最近流行的企业服务器端应用程序类型)。但是,除非您有一些非常具体的需求,否则我肯定会投资学习JPA关系注释。

在JPA中,一切都在EntityManager会话中进行。如果你有一个EntityManager实例在整个工作流程中管理你的实体,你提到你需要获取用户,项目等。,所有这一切都在一个请求 - 响应中,那么肯定会使用@OneToMany等,因为它将负责在需要的时候获取子实体,而不关心如何加入外键,并在何时检索什么时进行优化。即使您需要在请求中携带相同的实体,但使用refresh()merge()时也很简单。

我同意你说的注释往往会变得有点毛毛与FetchType,CascadeType的等等,你可能还面临着偶尔的臭名昭著的PersistenceException cannot simultaneously fetch multiple bags,所以它是一个颠簸,但一旦你得到了它的窍门,我认为它值得投资。