我有一个正在运行的ENVER项目,我正在最终确定实现并注意到属性级别修改跟踪功能。此功能听起来非常适合我们的需求,并将取代一些(手动)表格。
问题出在这里; 我在数据库中设置了字段,但是当我更改状态列等内容时,它们不会被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
**** **** EDIT 我们正在使用Hibernate 4.3.11.Final
答案 0 :(得分:2)
这样做的根本原因是我将全局“org.hibernate.envers.global_with_modified_flag”设置为false并且框架中存在一个错误,其中IF设置了此值,与其他全局配置不同,它无法覆盖。我已针对此问题记录HHH-10468。
另一个警告是,@Audited注释的withModifiedFlag(和modifiedColumnName)属性在类级别指定时绝对不会执行任何操作。我已针对此问题记录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
//...
}
希望这可以帮助其他任何人抓住这个。