【问题标题】:Understanding bidirectional relationship from Hibernate documentation从 Hibernate 文档中了解双向关系
【发布时间】:2014-08-24 09:39:51
【问题描述】:

我正在查看Hibernate documentation for bidirectional relationship,在文档中它说:

示例 7.21。双向一对多,多对一作为关联所有者

@Entity
public class Troop {
    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk")
    public Troop getTroop() {
    ...
}   

Troop 与 Soldier 具有双向的一对多关系 通过部队财产。您不必(不得)定义任何 mappedBy 端的物理映射。

映射一个双向的一对多,以一对多的边作为 拥有方,您必须删除 mappedBy 元素并设置许多 一个@JoinColumn 作为可插入和可更新为false。这个解决方案 未优化,会产生额外的 UPDATE 语句。

示例 7.22。作为所有者的一对多方的双向关联

@Entity
public class Troop {
    @OneToMany
    @JoinColumn(name="troop_fk") //we need to duplicate the physical information
    public Set<Soldier> getSoldiers() {
    ...
}

@Entity
public class Soldier {
    @ManyToOne
    @JoinColumn(name="troop_fk", insertable=false, updatable=false)
    public Troop getTroop() {
    ...
}

由于我是 Hibernate 的新手,我很难理解这一点。

1) 当文档说: You don't have to (must not) define any physical mapping in the mappedBy side.

2) 7.22 中的 @JoinColumnname 属性具有相同的值 (troop_fk)。我们可以指定不同的值吗?在这里设置insertable=false, updatable=false有什么好处和坏处?

谁能解释一下?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    这是一个双向关联。因此,如果一个士兵对一个部队进行 balongs,则该部队包含该士兵。这只是同一件事的两种说法。

    在 Soldier 中,您可以说明关联在数据库中的表示方式:使用名为 troop_fk 的连接列:

    @JoinColumn(name="troop_fk")
    public Troop getTroop() {
    

    因此,在此双向关联的另一端重复相同的信息是多余的。你不能这样做。通过说

    @OneToMany(mappedBy="troop")
    public Set<Soldier> getSoldiers() {
    

    您告诉 Hibernate getSoldiers() 是双向关联的反面,并且此关联的映射方式可以在 Soldier.troop 属性中找到。

    关于你的第二个问题。再一次,目标是定义一个单一,但双向的关联。您不需要两个不同的外键来映射单个关联。因此,为连接列指定一个不同的名称是没有意义的:它会创建一个不同的单向关联。

    这种做法是一种丑陋的 hack,AFAIK 不支持 JPA 规范。 JPA 规范要求双向 OneToMany 关联的所有者方是多方。事实上,它创建了两个以相同方式映射的单向关联,并告诉 Hibernate(使用 insertable = false 和 updatable = false)在保存实体时忽略其中一个。当从数据库中读取一个士兵时,它会填充到士兵.troop 中,但是在保存士兵时,您输入到士兵.troop 中的任何内容都将被忽略。恕我直言,您应该避免这种方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多