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?
我想说这是预期的行为。根据Hibernate手册,@PreUpdate是“在数据库UPDATE操作之前执行”。因此,Hibernate 已经发现它必须通过运行脏检查并让它返回 true 来执行 UPDATE。
脏检查不能发生 AFTER ,因为除非脏检查为真,否则@PreUpdateHibernate 不应该调用。@PreUpdate如果要运行更新,版本应该增加。
您是否考虑过使用监听器 for@PrePersist来代替@PreUpdate?我相信这在过程中已经足够早了,它将是预脏检查,因此具有您想要的行为。
| 归档时间: |
|
| 查看次数: |
2778 次 |
| 最近记录: |