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

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

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

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

谁能给点意见和建议?

【问题讨论】:

    标签: hibernate jpa jpa-2.0


    【解决方案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 很快就会用完用于添加新堆栈帧的缓冲区,并且您开始遇到 Stackoverflow 错误。

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

    【讨论】:

      猜你喜欢
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      相关资源
      最近更新 更多