Java JPA-何时使用关系?

Java JPA-何时使用关系?,java,jpa,Java,Jpa,我还没有完全适应JPA的阶段 现在,我在使用关系注释和在需要查询时检索相关对象之间左右为难 例如,我有一个拥有项目的用户。我可以使用onetomany关系并以对象方式检索项目,或者在需要时简单地查询用户的项目 后一种解决方案涉及更多的代码,但不知何故,我对自己想做的事情有了更多的自由和控制,或者至少这是我的印象。前者显然会处理相当多的锅炉板代码,例如对象的创建/删除/更新,但在此过程中有相当多的技巧需要学习 如果有人能提出一个简单的经验法则来说明什么时候在JPA中使用关系注释,我将不胜感激,最好

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

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

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

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

如果有人能提出一个简单的经验法则来说明什么时候在JPA中使用关系注释,我将不胜感激,最好是基于她/他的经验

谢谢


Thomas

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

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

我会选择注释。它更简单,生成的代码更少,这就是使用JPA的全部意义。而且默认情况下,一对多集是延迟获取的,因此您不会冒险从数据库中获取不需要的内容


但我建议大家多读一些关于懒散/急切抓取的知识,并学习它是如何工作的。

我会选择注释。它更简单,生成的代码更少,这就是使用JPA的全部意义。而且默认情况下,一对多集是延迟获取的,因此您不会冒险从数据库中获取不需要的内容


但我建议大家阅读一下懒惰/急切抓取,并了解它是如何工作的。

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

SELECT p
FROM Project p
WHERE p.user.name = 'Smith'
您不能在以下情况下执行此操作:

@ManyToOne
private User user
项目
关系中,您有一个简单的:

private int userId;

此外,还应研究各种获取策略,以使关系更舒适。

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

SELECT p
FROM Project p
WHERE p.user.name = 'Smith'
您不能在以下情况下执行此操作:

@ManyToOne
private User user
项目
关系中,您有一个简单的:

private int userId;

还可以研究各种获取策略,以便更轻松地处理关系。

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

在JPA中,一切都围绕EntityManager会话进行。如果您有一个EntityManager实例在整个工作流中管理您的实体,您要提到的是在哪里需要获取用户、项目等,那么在一个请求-响应中,一定要使用@OneToMany等,因为它会在任何时候获取子实体您需要它们,而不必关心如何连接外键,还可以优化何时检索内容。即使您需要在请求中携带相同的实体,使用和也非常简单


我同意您的看法,FetchType、CascadeType等的注释往往会有点麻烦,您可能还会偶尔遇到臭名昭著的PersistenceException,因此这是一段颠簸的旅程,但一旦掌握了窍门,我认为这是值得投资的。

这一切都取决于您的应用程序在检索数据和输入数据方面的工作方式虽然JPA可以在任何地方使用,甚至在JavaEE容器之外(这对于标准JavaSE应用程序或Spring等来说是一个巨大的优势),但我发现它的“思维方式”非常倾向于请求-响应式交互、映射到web应用程序等(公平地说,这是当今最流行的企业服务器端应用程序类型)。然而,除非您有一些非常特殊的需求,否则我肯定会投资学习JPA关系注释

在JPA中,一切都围绕EntityManager会话进行。如果您有一个EntityManager实例在整个工作流中管理您的实体,您要提到的是在哪里需要获取用户、项目等,那么在一个请求-响应中,一定要使用@OneToMany等,因为它会在任何时候获取子实体您需要它们,而不必关心如何连接外键,还可以优化何时检索内容。即使您需要在请求中携带相同的实体,使用和也非常简单


我同意你的看法,FetchType、CascadeType等的注释往往会有点麻烦,你也可能会偶尔遇到臭名昭著的PersistenceException,所以这是一段颠簸的旅程,但一旦你掌握了窍门,我认为这是值得投资的。

基本规则是你必须