JPA双向关系的优缺点

Posted

技术标签:

【中文标题】JPA双向关系的优缺点【英文标题】:Pros and cons of JPA bidirectional relationships 【发布时间】:2014-03-17 17:48:41 【问题描述】:

我的情况是我需要将我的 JPA 单向关系更改为双向Account 实体有一个 Advertisements 列表),因此给定 Advertisement 我可以确定它是否属于Account(出于安全原因)。

似乎横切关注点对我的应用程序施加了设计决策,我不确定这是否好。

另外,我不知道使用双向关系的缺点是什么。

谁能给点意见和建议?

【问题讨论】:

【参考方案1】:

让我试着用一个例子来回答这个问题:

@Entity
public clas Account 

    @OneToMany(mappedBy = "account") // is mappedBy really necessary ?
    private List<Advertisements> advertisements;

单向缺点: 缺少mappedBy 属性会导致单向的一对多关系并产生由外键组成的附加连接表。这通常被视为 JPA 陷阱,并对数据库级别的性能产生负面影响(您有三个表而不是两个)。

@Entity
public clas Advertisements 

    @ManyToOne
    @JoinColumn(name="ACCOUNT_ID")
    private Account account; // is Account really necessary ?

双向缺点: 您可以从Advertisements 导航到Account,因此就JPA 而言,您可以访问单值关联路径"SELECT adv.account FROM Advertisements adv"。假设您不希望因此有人会说这可能会对 JPA 级别的安全性产生负面影响。

【讨论】:

非常感谢您的回复。您能否详细说明双向缺点:“对 jpa 级别的安全性的负面影响”是什么意思? 我只是强调了account对象可以通过查询封装它的Advertisements对象轻松访问。如果没有account,这根本不可能。我只能想象这样一种情况,即出于任何原因应该禁止该方向的访问(即广告不应该对使用它们的帐户有任何了解,就像汽车不应该对使用的司机有任何了解一样他们)。 好的。我懂了。非常感谢您的意见。标记为已接受。【参考方案2】:

双向关系的另一个缺点是,使用 Jackson、Hibernate JPA 和/或 Elasticsearch 实现很容易让自己陷入无限递归。在您的每个模型中,您将维护另一个模型的实例。 因此,例如,当您维护一个帐户时,您还必须维护其广告。

假设应用程序在繁忙的一天处理高于中等数量的请求。接下来发生的事情是,控件将开始在维护它们关系的实例的方法之间来回循环,为每个循环在调用堆栈中创建一个新的堆栈帧条目。每个堆栈帧都保存对方法参数、局部变量和返回地址的引用。 JVM 很快就会用完用于添加新堆栈帧的缓冲区,并且您开始遇到 *** 错误。

并非总是如此,但如果您正在处理处理大量持久性请求(而不是大量数据检索或数据分析请求)的应用程序,双向关系的好处很快就会消失面对在持久层上避免 *** 错误需要付出多少努力和彻底性。

【讨论】:

以上是关于JPA双向关系的优缺点的主要内容,如果未能解决你的问题,请参考以下文章

层次结构中 JPA 实体之间的双向关系

循环依赖双向@OneToMany JPA 关系

Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

使用连接表将 JPA 双向 @ManyToOne 关系映射到多个表

如何在 Kotlin 中使用 JPA ManyToMany 双向关系

JPA 2 上的列表与设置 - 优点 / 缺点 / 方便