为什么每次Web应用程序调用{{1}}时Hibernate都会执行两次SQL更新?当我发现数据库记录的版本将增加1,3,5,...而不是1,2,3,......时,我首先注意到了这一点。
首先,我在IDE中设置了一个断点,以验证我的应用程序只调用EntityManager#merge(T entity)
一次。其次,我设置了
EntityManager#merge(T entity)
persistence.xml中的。我惊讶地发现SQL更新执行了两次:
<property name="hibernate.show_sql" value="true"/>
为什么update语句会被执行两次?这是否与Hibernate Envers审核记录有关?
更新:这是Java代码:
Hibernate:
update
applicationuser
set
timestamp=?,
userstamp=?,
version=?,
email=?
where
id=?
and version=?
Hibernate:
select
nextval ('hibernate_sequence')
Hibernate:
insert
into
REVINFO
(REVTSTMP, REV)
values
(?, ?)
Hibernate:
insert
into
applicationuser_AUD
(REVTYPE, hashcode, timestamp, email, userstamp, id, REV)
values
(?, ?, ?, ?, ?, ?, ?)
Hibernate:
update
applicationuser
set
timestamp=?,
userstamp=?,
version=?,
email=?
where
id=?
and version=?
更新:
禁用审核会导致问题消失,例如在注释掉 @Stateless
@LocalBean
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class UserService {
@PersistenceContext EntityManager em;
public User merge(@Nonnull User user) {
return em.merge(user);
}
}
注释后,在调用UPDATE
时只执行一个SQL EntityManager#merge(T entity)
语句。因此,Envers审计似乎是造成双重更新的原因。这是Envers的预期行为吗?为什么Envers会进行双重更新?我可以在不禁用Envers的情况下进行此停止吗?
@Audited