Jpa - Hibernate @Version错误地增加了

zim*_*ime 11 hibernate jpa version

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

如果我在合并之前更改了值,然后在Listener中的@PreUpdate方法中更改了该值,则设置原始值,我的实体结果版本会增加,但在数据库版本上有先前的值.我认为这是由于对象没有改变,所以在db上它没有更新,但是实体上的版本是alredy递增而不是在刷新后恢复.

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

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

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

    private String myValue;

    @Version    
    private Long version ;
}
Run Code Online (Sandbox Code Playgroud)

这个听众:

public class MyListener {

    @PreUpdate
    public void preUpdate(MyEntity ua) { 
        ua.setMyValue("default");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

sha*_*kan 2

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

脏检查不能发生 AFTER ,因为除非脏检查为真,否则@PreUpdateHibernate 不应该调用。@PreUpdate如果要运行更新,版本应该增加。

您是否考虑过使用监听器 for@PrePersist来代替@PreUpdate?我相信这在过程中已经足够早了,它将是预脏检查,因此具有您想要的行为。