Модификация поля ENVERs не установлена

У меня есть рабочий проект ENVERs, который я завершал реализацию и заметил функцию отслеживания изменения уровня свойства. Эта функция идеально подходит для наших нужд и заменит несколько (ручных) таблиц.

Проблема приходит здесь; У меня есть поля, установленные в базе данных, но они не обновляются ENVER, когда я изменяю такие вещи, как столбец состояния.

Таблица;

DROP TABLE IF EXISTS `enrollment_history` ;
CREATE TABLE `enrollment_history` (
  `revision` INTEGER NOT NULL,
  `revision_type` INTEGER NOT NULL,
  `enrollment_id` BIGINT(20) NOT NULL,
  `enrollment_status_id` BIGINT(20) NOT NULL,
  `enrollment_status_id_modified` boolean NOT NULL default 0,
  PRIMARY KEY USING BTREE (`enrollment_id`, `revision`))
 ENGINE=INNODB;

POJO:

@Entity
@Table(name = "enrollment")
@Audited(withModifiedFlag = true)
public class Enrollment implements Serializable {
    //...
    @Column(name = "enrollment_status_id", nullable = false)
    @NotNull
    @Enumerated(EnumType.ORDINAL)
    @Audited(modifiedColumnName = "enrollment_status_id_modified")
    private EnrollmentStatus status;

    // getters setters etc
    //...
}

DAO

public class DAO {

    @Autowired
    private SessionFactory sessionFactory;

    public AuditReader getAuditReader() {
        return AuditReaderFactory.get(sessionFactory.getCurrentSession());
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<Enrollment> getEnrollmentsWhereStatusIsChanged(long userId) {
        AuditReader reader = getAuditReader();

        List<Enrollment> specificChanges =
        //@formatter:off
                reader
                .createQuery()
                .forRevisionsOfEntity(Enrollment.class, true, true)
                    .add(AuditEntity.id().eq(userId))
                    .add(AuditEntity.property("status").hasChanged())
                .getResultList();
        //@formatter:on

        return specificChanges;
    }
}

Любое руководство по тому, что мне не хватает, было бы замечательно. Похоже, что Envers знает о полях, поскольку он больше не жалуется на сопоставления, но во время выполнения ему не хватает чего-то, чтобы заполнить их или прочитать данные из них.

Это ошибка, которую я получаю во время выполнения;

org.hibernate.QueryException: could not resolve property: status_modified of: com.intellimec.drivesync.database.entity.enrollment.Enrollment_history 

**** РЕДАКТИРОВАТЬ **** Мы используем Hibernate 4.3.11.Final

1 ответ

Решение

Основная причина этого заключается в том, что глобальный "org.hibernate.envers.global_with_modified_flag" установлен в значение "ложь", и есть ошибка в структуре, в которой, если установлено это значение, его нельзя переопределить, в отличие от других глобальных конфигураций. Я вошел HHH-10468 для этой проблемы.

Другое предостережение, атрибуты withModifiedFlag (и updatedColumnName) аннотации @Audited абсолютно ничего не делают при указании на уровне класса. Я вошел HHH-10469 для этой проблемы.

Чтобы обойти эти проблемы, я удалил глобальные настройки из списка, так как они не могут быть переопределены, и изменил мой POJO, чтобы он выглядел так;

@Entity
@Table(name = "enrollment")
@Audited
public class Enrollment implements Serializable {
    //...
    @Column(name = "enrollment_status_id", nullable = false)
    @NotNull
    @Enumerated(EnumType.ORDINAL)
    @Audited(withModifiedFlag = true, modifiedColumnName = "enrollment_status_id_modified")
    private EnrollmentStatus status;

    // getters setters etc
    //...
}

Надеюсь, что это поможет кому-то еще, кто пойман на этом

Другие вопросы по тегам