Hibernate审计历史读者异常

时间:2018-05-16 08:32:56

标签: java postgresql hibernate hibernate-envers

我通过hibernate-envers库配置了审计,它工作正常,直到我想通过AuditReader API读取历史记录。

这是代码:

AuditReader auditReader = AuditReaderFactory.get(entityManager);
List<Number> revisionNumbers = auditReader.getRevisions(Queue.class, queue.getId());
        for (Number rev : revisionNumbers) {
            Queue auditedQueue = auditReader.find(Queue.class, queue.getId(), rev);
            audQueues.add(auditedQueue);
        }

抛出的异常是 org.postgresql.util.PSQLException:错误:运算符不存在:smallint&lt;&gt; BYTEA   提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。   职位:879

我配置了sql日志记录,我看到了失败的查询:

select queue_aud0_.ID as ID12_, queue_aud0_.REV as REV12_, queue_aud0_.REVTYPE as REVTYPE12_ from CMSMS_QUEUE_AUD queue_aud0_ where (queue_aud0_.REV=(select max(queue_aud1_.REV) from CMSMS_QUEUE_AUD queue_aud1_ where (queue_aud1_.REV<=? )and(queue_aud0_.ID=queue_aud1_.ID )))and(queue_aud0_.REVTYPE<>? )and(queue_aud0_.ID=? )

选择了更多的列,但它们现在并不重要... hibernate使用的参数是:

bindNamedParameters() TEST_NEW -> _p1 [3]
bindNamedParameters() DEL -> _p0 [2]
bindNamedParameters() 5 -> revision [1]

我尝试使用这些参数运行查询,并抛出相同的异常。原因是第二个参数 queue_aud0_.REVTYPE&lt;&gt;?,因为hibernate试图设置'DEL'字符串,而REVTYPE是smallint。这很奇怪,因为这些表是由hibernate自动生成的......任何想法为什么会这样做?

我使用版本4.2.0.Final

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-envers</artifactId>
    <version>4.2.0.Final</version>
</dependency>

1 个答案:

答案 0 :(得分:0)

在玩了一些依赖项之后,现在可以正常工作了。我将Hibernate切换到5.3.0.Final和SpringFramework到5.0.5.RELEASE。还删除了一些冗余的JPA依赖项。不能确切地说,是什么解决了这个问题,因为我必须将这些所有依赖项一起更改为甚至运行应用程序。