如何解决@OneToOne JPA中未映射的列
我有两个实体(foo和bar),当我从foo映射时,一切正常:
在Foo
@OneToOne(cascade = CascadeType.ALL,orphanRemoval = true)
private Bar bar;
在酒吧
@OneToOne(mappedBy = "bar",cascade = CascadeType.ALL,orphanRemoval = true)
private Foo foo;
当我保存一个foo时,正如我所期望的那样,所包含栏的id存储在bar_id列的新foo条目中。
但是如果我反过来做,在Foo中
@OneToOne(mappedBy = "foo",orphanRemoval = true)
private Bar bar;
在酒吧
@OneToOne(cascade = CascadeType.ALL,orphanRemoval = true)
private Foo foo;
我希望,当我保存Foo时,包含栏的foo的id将存储在bar表中新条目的foo_id列中,但是在这种情况下始终为null,然后不我知道了就可以使用。
PS:我知道第一种情况就足够了,但是对于某些限制,我更喜欢第二种情况,另一方面,我想知道为什么会在以后发生这种情况
根据@SternK的建议,我遵循文档中的@OneToOne bidrectional example,将方法添加到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列仍然为null,当我获取foo时就拥有
{
"id": 1,"name": "foo1","bar": null
}
解决方法
如果您使用双向关联(使用mappedBy
属性对此进行了说明),则如documentation中所述,您应该使双方同步:
每当建立双向关联时,应用程序开发人员就必须确保双方始终保持同步。
这意味着您应该在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;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。