Hibernate Envers: withModifiedFlag не установлен в 1, если значение столбца INT изменено на NULL

У меня есть аннотация @Audited(withModifiedFlag = true) для всех свойств Entity, которые необходимо зафиксировать в моей таблице аудита. Он отлично работает во всех случаях, кроме удаления значения. Это означает, что если значение моего столбца установлено из NULL/INT в какое-то ненулевое значение, то соответствующее значение modifiedColumn устанавливается в 1, но если значение установлено из любого значения INT в NULL, тогда modifiedColumn устанавливается в 0 (указывает, что не изменено). Я понятия не имею, почему это происходит. Я проверил документы Envers, а также список открытых вопросов Envers и ничего не нашел по этому поводу.

Кстати, я использую Hibernate & Hibernate-Envers 4.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 (истина). И для значений NULL флаг устанавливается в 0.

Спасибо за прочтение!


person Diablo    schedule 16.08.2016    source источник
comment
Какую версию Envers вы используете?   -  person Naros    schedule 16.08.2016
comment
Я использую hibernate-envers-4.1.12.Final.jar.   -  person Diablo    schedule 17.08.2016
comment
Можете ли вы включить свои сущности и то, как именно ваш код изменяет их? Я создаю простой IntegerValueEntity со столбцом значений Id и Integer, и когда я изменил значение на null, поле value_MOD было равно 1 при работе с 4.1.12.   -  person Naros    schedule 18.08.2016
comment
@Naros - я обновил вопрос информацией о сущности и соответствующими значениями справочной таблицы для справки.   -  person Diablo    schedule 19.08.2016
comment
Не могли бы вы включить код, в котором вы изменяете свою сущность и фиксируете ее? Может, там что-то странное происходит? Используете ли вы какие-либо другие библиотеки, которые генерируют геттеры/сеттеры и т. д.?   -  person Naros    schedule 19.08.2016
comment
мои геттеры/сеттеры реализованы мной, и они просты. В моем приложении я конвертирую информацию DTO в этот объект объекта Latency, а затем вызываю метод session.saveOrUpdate(entiy) в моем Dao.   -  person Diablo    schedule 20.08.2016


Ответы (1)


Там должно быть наперекосяк с вашим сценарием.

Я использовал следующее сопоставление сущностей и код в 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

Если ваша сущность более сложна или ваша бизнес-логика более сложна, как только вы поделитесь этой информацией, я соответствующим образом обновлю этот ответ.

person Naros    schedule 18.08.2016