Модификация поля 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
//...
}
Надеюсь, что это поможет кому-то еще, кто пойман на этом