当前位置: 首页 > 知识库问答 >
问题:

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

温浩大
2023-03-14

我在所有实体属性上都有@Audit(withModifiedFlag=true)注释,需要在我的审计表中捕获这些属性。除了值删除之外,它在所有情况下都能很好地工作。也就是说,如果我的列的值从NULL/INT设置为某个非NULL值,则相应的modifiedcolumn值设置为1,但是如果该值从任何INT值设置为NULL,则modifiedcolumn设置为0(表示未修改)。我不知道为什么会这样。我已经检查了Envers的文档和Envers的开放问题列表,但没有找到任何关于它的东西。

顺便说一下,我使用的是Hibernate&hibernate-envers4.1.12.最终版本。

更新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()

}

请注意,在每一次修订,即使是一列得到更新,所有其他标志设置为1(真)。并且,对于空值,标志设置为0。

感谢阅读!

共有1个答案

闻人河
2023-03-14

你的设想一定有问题。

我在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

如果您的实体更复杂,或者您的业务逻辑更复杂,那么一旦您共享了这些信息,我就会相应地更新这个答案。

 类似资料:
  • 我尝试使用liquibase使用liquibase“addDefaultValue”语法将我的列的默认值设置为null: 但是向myTable插入新行显示默认值仍然设置为“false”,就像以前一样。所以liquibase更改集不起作用。 如何设置列默认值为null与liquibase?

  • 问题内容: 我正在运行一个非常简单的查询,但是对于某些结果,一个字段中的值为空。如果该值为null,如何将其设置为“字符串”? 就像是 它将在sql server 2005上运行 谢谢 问题答案: 使用以下内容: 或@Lieven指出: COALESCE的动态之处在于您可以定义更多的参数,因此,如果第一个为null,则获取第二个参数,如果第二个为null,则获取第三个,依此类推…

  • 我有一个名为的DataFrame,它具有混合类型的列。我正在尝试将的列的任何空值设置为。我认为下面的代码可以工作,但事实并非如此。 我正在查看错误消息,它并没有给我多少线索: Traceback(最近的最后一次调用):File",第1行,在File"/usr/lib/python2.7/site-pack/pyspark/sql/column.py",第116行,在_njc=getattr(自身_

  • 问题内容: 我希望将值设置为如果我提交的表单中的文本框未放入任何内容。我怎样才能做到这一点?我尝试插入,但这只是将单词添加到字段中。 我不确定应该为此提供什么代码,我只是在编写UPDATE查询。 问题答案: 不要在更新语句中加引号。这应该工作:

  • 问题内容: 我将每个列都设置为,但是由于某种原因,我仍然能够在每个列中添加一个值。这是我的表信息(创建语法): 这是一个有效的示例: 有什么想法为什么会这样? 问题答案: 您要插入空字符串,而空字符串不是,要检查错误,请执行以下操作: 你会看到错误。该只对那些不值检查。 为了防止空字符串,您必须使用触发器,或者在执行查询之前对服务器端编程语言进行检查以将空字符串转换为。的示例触发器可能类似于:(这

  • 使用Spring3设置hibernate有更多问题。这一次是说连接是nul,因为没有设置方言,它在我的hibernate.cfg.xml文件上。