ENVERs字段修改没有设置

时间:2016-01-04 22:09:49

标签: java hibernate hibernate-envers

我有一个正在运行的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

1 个答案:

答案 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
    //...
}

希望这可以帮助其他任何人抓住这个。