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双向关系的优缺点的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)
使用连接表将 JPA 双向 @ManyToOne 关系映射到多个表