未设置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.最终

根本原因是我将全局"org.hibernate.envers.global_with_modified_flag"设置为false,并且在设置该值的框架中存在一个错误,与其他全局配置不同,如果设置了该值,则无法覆盖该值。我已经为此问题登录了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
    //...
}

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

最新更新