【问题标题】:Owner side with JoinColumns annotation带有 JoinColumns 注释的所有者方
【发布时间】:2016-07-15 22:19:12
【问题描述】:

我有以下情况:
我很难弄清楚所有者是什么,为什么? 请问你能帮忙吗?

public class Basket
{

...

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumns({@JoinColumn(name="BASKET", referencedColumnName="ID")})   
    public Set<Product> getProductList() {
        return this.productList;
    }
}

public class Product
{

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
    @JoinColumns({@JoinColumn(name="BASKET", referencedColumnName="ID")})
    public Basket getBasket() {
        return this.basket;
    }

}

【问题讨论】:

  • 为什么? @JoinColumns({@JoinColumn(name="BASKET", referencedColumnName="ID")}) 只是@JoinColumn(name="BASKET", referencedColumnName="ID")
  • 我不知道我也想弄清楚..我从其他人那里继承了这个代码

标签: java hibernate jpa entity


【解决方案1】:

购物篮是关系的“一”面,有许多产品被标识为购物篮。所以“一”通常是父代码,子记录引用父代码。通常,理解这些最简单的方法是查看连接后备表的数据库外键约束(希望有一个)。

【讨论】:

    【解决方案2】:

    一个客户有一个篮子,一个篮子有一个所有者,所以:

    class Owner 拥有与@OneToOne 相关的购物篮。

    一个篮子有很多产品,所以:

    class Basket 拥有与@OneToMany 相关的产品列表。

    许多产品都有一个篮子,所以:

    class Product@ManyToOne 有关系。

    【讨论】:

      【解决方案3】:

      JPA 2.0 specification 的摘录可能会帮助您理解问题:

      2.10.2双向多对一/一对多关系

      假设:

          Entity A references a single instance of Entity B.
          Entity B references a collection of Entity A[21].
      

      实体 A 必须是关系的所有者。

      以下映射默认值适用:

      Entity A is mapped to a table named A.
      Entity B is mapped to a table named B.
      

      表 A 包含表 B 的外键。外键列名由以下内容的串联构成:实体 A 的关系属性或字段的名称; "_";表 B 中主键列的名称。外键列的类型与 B表的主键。

      在第 11.1.21 节中声明如下:

      如果有多个连接列,则必须使用 JoinColumns 注释为每个连接列指定一个 JoinColumn 注释。 name 和 referencedColumnName 元素都必须在每个这样的 JoinColumn 注释中指定。

      在您的情况下,只有一个连接列。所以你不需要@JoinColumns 注释。只需使用@JoinColumn@JoinColumn 注释始终用于关系的拥有方,在本例中为@ManyToOne 方。

      【讨论】:

      • 谢谢,但我认为在我的示例中使用这些注释,其中一个是所有者,我想了解为什么?
      • OneToMany 方不能是关系的所有者。所有者始终是您将外键放在数据库术语中的那个人。您不能将外键放在One 一侧;如果你这样做,你将在数据库中为同一记录有多个值。我不是想说服你;我只是告诉你框架如何处理关系以及如果数据库应该符合关系数据库范式,应该如何设计数据库。
      • 对不起,我认为你说的不对docs.jboss.org/hibernate/annotations/3.5/reference/en/…
      • 我看到了你链接的内容;但上面的报价不是我的;这是官方的 JPA 规范。 Hibernate 如何实现它不是我的问题。我相信这是正确的方法。 This solution is not optimized and will produce some additional UPDATE statements. 我在您链接的文档的第 2.2.5.3.1 节中读到的内容。
      • 如果您想了解映射背后的概念,您可能还想阅读this documentation。它有很多例子展示了如何正确映射。
      猜你喜欢
      • 1970-01-01
      • 2017-12-25
      • 2021-03-28
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 2014-06-09
      相关资源
      最近更新 更多