java - @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
}
解决方案
如果您使用双向关联(使用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;
}
}
}
推荐阅读
- docker - 如何使用 go build 创建可以在 docker 容器中运行的动态可执行二进制文件?
- java - 无法解析为变量 eclipse 主类
- java - 退出代码 0 而不是打印?
- c++ - 在 C++ 中使用向量进行单词搜索
- amazon-web-services - 同步 Web 服务和后端异步的良好实践
- reactjs - 如何使用 React 和 TypeScript 创建一个 ag-Grid 单元格编辑器?
- python - Python 科学记数法 - 将 D 转换为 E
- c - 如果函数指针未初始化,函数指针作为参数的函数如何接受它?
- python - 就 ax.spines 而言,set_position('center') 和 set_position('zero') 有什么区别
- ruby-on-rails - 按给定数组的顺序按列名查找模型记录