为什么Hibernate在每次使用Envers审计时调用EntityManager#merge(T实体)时都会执行两次SQL更新?

时间:2015-11-13 05:25:00

标签: java hibernate java-ee jpa hibernate-envers

为什么每次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

0 个答案:

没有答案