首页 文章

Hibernate Envers:“withModifiedFlag”未设置为1,INT列值更改为NULL

提问于
浏览
0

我在所有Entity属性上都有 @Audited(withModifiedFlag = true) 注释,需要在Audit表中捕获 . 除了值删除之外,它适用于所有情况 . 含义,如果我的列的值从NULL / INT设置为某个非空值,则相应的 modifiedColumn 值设置为1,但如果该值从任何INT值设置为NULL,则 modifiedColumn 设置为0 (表示未修改) . 我不知道为什么会这样 . 我已经检查了Envers文档以及Envers打开问题列表,但没有找到任何相关信息 .

顺便说一句,我使用Hibernate和Hibernate-Envers 4.1.12.Final版本 .

Update 1

这是我的实体细节:

@Entity
@Audited(withModifiedFlag = true)
@AuditTable("AuditLatency")
public class Latency {

    @Id
    @Column(name = "Id")
    private Long id;

    @Column(name = "DataCenter1")
    private Long dataCenter1;

    @Column(name = "DataCenter2")
    private Long dataCenter2;

    @Column(name = "DataCenter3")
    private Long dataCenter3;

    @Column(name = "StatusId")
    @Type(type = "enum_status_active_inactive_type")
    private Status statusId;

    //getXXX() & setXXX()

}

审计表结果:
enter image description here

请注意,在每个修订版中,即使其中一个列更新了所有其他标志设置为1(true) . 并且,对于NULL值,标志设置为0 .

谢谢阅读!

1 回答

  • 0

    你的场景一定有问题 .

    我在4.1.12.Final上使用了以下实体映射和代码,并观察到修改后的标志设置正确 .

    @Entity
    @Audited(withModifiedFlag = true)
    public class IntegerValueEntity {
      @Id
      @GeneratedValue
      private Integer id;
      private Integer value;
      /* getter/setters */
    }
    
    @Test
    public void runTest() {
        EntityManager entityManager = getEntityManager();
        try {
            // revision 1, everything null
            SimpleEntity ive = new IntegerValueEntity();
            entityManager.getTransaction().begin();
            entityManager.persist( ive );
            entityManager.getTransaction().commit();
    
            // revision 2, change value to non null
            entityManager.getTransaction().begin();
            ive.setValue( 25 );
            entityManager.getTransaction().commit();
    
            // revision 3, change value to null
            entityManager.getTransaction().begin();
            ive.setValue( null );
            entityManager.getTransaction().commit();
    
            final Boolean rev1 = getRevisionValueModifiedFlag( 1 );
            final Boolean rev2 = getRevisionValueModifiedFlag( 2 );
            final Boolean rev3 = getRevisionValueModifiedFlag( 3 );
    
            assertEquals( "Revision 1 should have been false", false, rev1 );
            assertEquals( "Revision 2 should have been true", true, rev2 );
            assertEquals( "Revision 3 should have been true", true, rev3 );
        }
        catch ( Exception e ) {
            if ( entityManager.getTransaction().isActive() ) {
                entityManager.getTransaction().rollback();
            }
            throw e;
        }
        finally {
            entityManager.close();
        }
    }
    

    所有 getRevisionValueModifiedFlag 都会使用以下内容执行本机查询:

    SELECT value_MOD FROM IntegerValueEntity_AUD WHERE REV = :rev
    

    如果您的实体更复杂或您的业务逻辑更复杂,一旦您共享该信息,我将相应地更新此答案 .

相关问题