首页 > 解决方案 > @OneToOne JPA 中未映射列

问题描述

我有两个实体(foo 和 bar),当我从 foo 映射时一切正常:

在富

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
private Bar bar;

而在酒吧

@OneToOne(mappedBy = "bar", cascade = CascadeType.ALL, orphanRemoval = true)
private Foo foo;

当我保存一个 foo 时,正如我所料,包含的 bar 的 id 存储在 bar_id 列中的新 foo 条目中。

但如果我反过来做,在 Foo

@OneToOne(mappedBy = "foo", cascade = CascadeType.ALL, orphanRemoval = true)
private Bar bar;

而在酒吧

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
private Foo foo;

我希望,当我保存一个 Foo 时,包含 bar 的 foo 的 id 将存储在 bar 表中新条目的 foo_id 列中,但在这种情况下始终为空,然后当我得到它。

PS:我知道第一种情况下的作品就足够了,但是对于某些限制我更喜欢第二种情况,另一方面,我想知道为什么会发生这种情况以防止将来发生

正如@SternK 建议的那样,我按照文档中的@OneToOne birectional 示例将方法添加到 Foo Class

    public void addBar(Bar bar) {
    bar.setFoo( this );
    this.bar = bar;
}

public void removeBar() {
    if ( bar != null ) {
        bar.setFoo( null );
        this.bar = null;
    }
}

但是 foo_id 列仍然为空,当我获取 foo 时,我有

{
    "id": 1,
    "name": "foo1",
    "bar": null
}

标签: javaspring-boothibernatejpaone-to-one

解决方案


如果您使用双向关联(使用mappedBy属性指示它),那么正如文档中所述,您应该使双方同步:

每当形成双向关联时,应用程序开发人员必须确保双方始终保持同步。

这意味着您应该有以下方法Foo

@Entity
public class Foo
{

   public void addBar(Bar bar)
   {
      this.bar = bar;
      bar.setFoo(this);
   }

   public void removeBar() {
      if (bar != null ) {
         bar.setFoo( null );
         this.bar = null;
      }
   }
}

推荐阅读