我尝试在使用 JPA 保存到数据库时自动重新哈希数据。 我的想法是,我有一个包含其他实体列表的实体。
A has a reference to a @OneToMany "List<B> myBList"
B => has a @ManyToOne "A a"
B
的哈希值仅基于实体的数据。
A
的哈希基于实体的数据和B
的列表的哈希
如果任何
B
被修改或创建并添加到 A
,我想重新哈希 A
的值。
但是,在我的 PreInsert 或 PreUpdateEvent 侦听器中,不要注册任何对
entityManager.save(a)
或 event.getSession().save(a)
的调用。
通过更改B
可以正确修改
Object[] state
哈希,但是使用b.getA()
,修改A
并保存不起作用。
我开始想知道这是否可以在事件监听器内部完成。
这是不可能的。 JPA 规范仅允许您修改触发生命周期回调的实体的非关系属性。
“生命周期回调方法可能会修改调用它的实体的非关系状态。” JPA 规格
原因是您的持久性提供程序首先检查您的代码是否更改了任何托管实体。如果是这种情况,则会处理此更改并触发生命周期回调。
如果此回调修改了另一个实体对象,就像您的哈希计算的情况一样,您的持久性提供程序不会意识到此修改并且不会处理它。