java - hibernate + spring data jpa 会自动创建具有 OneToOne 关系的父实体的子实体记录吗?
问题描述
在我每天花费 8 小时的商店中,我使用 jsf 2.x Web 应用程序。在其中,hibernate + spring data jpa 一起用于数据库事务。
我在该 Web 应用程序中共享Foo
Java 实体的简化版本。
@Entity
@Table(name="FOO")
public class Foo {
@Id
@Column(name="FOO_ID", nullable=false)
private UUID fooId;
@OneToOne(mappedBy="Foo", cascade=CascadeType.ALL,
orphanRemoval=true)
@NotFound(action=NotFoundAction.IGNORE)
@LazyCollection(LazyCollectionOption.FALSE)
private Bar bar;
@OneToOne(mappedBy="Foo", cascade=CascadeType.ALL,
orphanRemoval=true)
@NotFound(action=NotFoundAction.IGNORE)
@LazyCollection(LazyCollectionOption.FALSE)
private Zoo zoo;
}
如您所见,java实体Foo
并Bar
具有OneToOne
关系。在 UI 方面,当我进入需要填写表单的页面时,我将为该表单填写的数据将创建Foo
实例和子实例之一Bar
或Zoo
. 填写表格后,只有将实例CrudRepository.save(foo)
持久化到数据库的出口入口。Foo
其关联的子实体要么Bar
或Zoo
将被封装在Foo
实例中。
这是我遇到的一个奇特事件:
- 填写表格并保存它,这反过来会在每个表和数据库中分别创建一个记录
Foo
和Bar
实例。FooTable
BarTable
- 没有找到
ZooTable
预期的记录。 - 我
Foo
从网络应用程序重新访问相同的实例然后发生了一些奇怪的事情。 - 我注意到一条记录
ZooTable
仅在其自身的主键中创建,zoo_id
其父键作为外键foo_id
,但其余列映射为 NULL 形成数据。
我在应用程序中的方法中设置了一个断点,save()
期望页面加载时我希望它会被击中,但它从来没有这样做过。看起来应用程序正在绕过正确的出口入口以持久化到数据库,而是使用隐藏的后门出去并持久化到数据库。
我正在努力寻找答案,但我没有成功。我在这里读了几篇关于jpa auto save
这里的文章,但我既不完全理解也不完全理解他们提出的案例与我的场景相匹配。
我的猜测是它OneToOne
与Foo
它的子实体Bar
或Zoo
. 当您重新访问Foo
实例时,它会期望丢失的子实体会被提取(?)但是因为它没有单独找到休眠或弹簧数据 jpa 或者一起工作会创建一个幻像条目?
解决方案
推荐阅读
- python - 将变量附加到应用程序与 Flask 中的 current_app 相同吗?
- java - 有没有办法以编程方式读取 Java 中的 .jmod 文件?
- c# - 跟踪窗口打开的时间 WPF XAML
- git - .gitignore,排除文件夹中的所有文件......但保留那些带有.gitkeep的子文件夹?
- c++ - std::mutex 阻止线程修改什么?
- reactjs - 即使我先检查类型,Flow 也会抱怨类型不兼容
- python - 气流:为每个文件运行 DAG 的正确方法
- python - 一个接一个地发送异步HTTP请求
- c# - C#获取List中List的值匹配的List元素
- python - Tensorflow抛出distributed_function错误