0

我还没有完全适应 JPA 的阶段。

现在,我在使用关系注释或在需要查询时简单地检索相关对象之间左右为难。

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

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

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

谢谢,

托马斯

4

5 回答 5

2

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

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

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

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

于 2012-04-09T09:53:44.847 回答
1

您的问题是有效的,在符合 JPA 的 ORM 中关系很难。然而,关系的好处是能够在 JPA QL 查询中使用它们。例如,当您想获取用户创建的所有项目时,您可以编写:

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

你不能这样做,而不是:

@ManyToOne
private User user

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

private int userId;

还要研究各种获取策略,以使人际关系更舒服。

于 2012-04-09T09:42:47.453 回答
0

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

于 2012-04-09T09:25:55.323 回答
0

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

但我建议阅读惰性/渴望获取并了解其工作原理。

于 2012-04-09T09:26:13.317 回答
0

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

在 JPA 中,一切都围绕 EntityManager 会话进行。如果您有一个 EntityManager 实例在整个工作流程中管理您的实体,您提到您需要在哪里获取用户、项目等,所有这些都在一个请求-响应中,那么肯定会使用 @OneToMany 等,因为它会照顾孩子实体,无论何时需要它们,而无需关心如何加入外键,并且还对何时检索什么进行了优化。即使您需要跨请求携带相同的实体,使用refresh()merge()也非常简单。

我同意你的观点,使用 FetchType、CascadeType 等注释往往会有点麻烦,而且你可能还会偶尔遇到臭名昭著的无法同时获取多个包PersistenceException,所以这是一个颠簸的过程,但一旦你掌握了它,我想它值得投资。

于 2012-04-09T09:44:36.563 回答