gpt4 book ai didi

hibernate - Jpa - Hibernate @Version 错误地递增

转载 作者:行者123 更新时间:2023-12-04 02:26:43 34 4
gpt4 key购买 nike

我使用 jpa 和 hibernate (3.2.7) 作为 orm 实现。
我有一个正在修改然后合并的实体。
我在这个实体上也有一个 @EntityListeners 以确保某些属性被重视。

如果我在合并之前更改一个值,然后在 Listener 内的 @PreUpdate 方法中更改回该值,设置原始值,我的实体结果版本增加,但数据库版本具有以前的值。
我认为这是由于对象没有改变,所以在 db 上它没有更新,但是实体上的版本已经增加了而没有在刷新后恢复。

为了更好地解释,我有这个对象:

@Entity
@EntityListeners({MyListener.class})
public class MyEntity {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

private String myValue;

@Version
private Long version ;
}

和这个听众:
public class MyListener {

@PreUpdate
public void preUpdate(MyEntity ua) {
ua.setMyValue("default");
}
}

现在假设我在 db 上有一个具有以下值的对象:(id=1, myValue='defalut', version=1)。我读取了这个对象,分离,将它传递给客户端并用 myValue='new' 取回它并执行合并操作(监听器将 myValue 更改为 'default',因此对象结果未修改为 db),刷新并退出事务(所以已提交)。
之后,我在我的对象上找到 version=2,但在 db 上找到 version=1。

这是一个 hibernate 错误吗?还是 Jpa 错误?

最佳答案

我会说这是一种预期的行为。根据Hibernate manual , @PreUpdate是“在数据库更新操作之前执行。”。因此,Hibernate 已经发现它必须通过运行脏检查来执行 UPDATE,并让它返回 true。

脏检查不能在 @PreUpdate 之后发生,因为 Hibernate 不应该调用 @PreUpdate除非脏检查是真的。如果要运行更新,则应增加版本。

你有没有想过为 @PrePersist 使用监听器? , 而不是 @PreUpdate ?我相信这在过程中已经足够早了,它会进行预脏检查,从而具有您想要的行为。

关于hibernate - Jpa - Hibernate @Version 错误地递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7609155/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com