未设置 ENVERs 字段修改

ENVERs field modification not set

我有一个正在运行的 ENVERs 项目,我正在完成实施并注意到 属性 级别修改跟踪功能。这个功能听起来很适合我们的需求,可以取代一些(手动)表格。

问题就出在这里; 我在数据库中设置了字段,但是当我更改诸如状态列之类的内容时,ENVERs 没有更新它们。

Table;

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

根本原因是我将全局 "org.hibernate.envers.global_with_modified_flag" 设置为 false 并且框架中存在错误,如果设置了此值,则无法覆盖它,这与其他全局配置不同。我已经记录了这个问题 HHH-10468

另一个警告,@Audited 注释的 withModifiedFlag(和 modifiedColumnName)属性在 class 级别指定时绝对不执行任何操作。我已经记录了这个问题 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
    //...
}

希望这可以帮助其他陷入困境的人。