@已审计的废墟查询

编程语言 2026-07-09

我正在为一个新模块添加Hibernate Envers,并且模块中有新实体。一旦我给这些实体加上 @Audited注解,所有查询就再也检索不到结果。所有的 _AUD表都存在,一个简单的

entityManager.find

能够按ID检索实体。

带查询的简化实体:

@NamedQuery(name = "queryA",
        query = "SELECT u FROM A u "
            + "WHERE u.businessKey=:key")
@Entity
@Audited
@Table(name = "A")
public class A {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", unique = true, nullable = false)
private long id;
@Column(name = "BUSINESS_KEY", nullable = false)
private long businessKey;
...
}

执行queryA时,getResultList() 返回空列表。将 @Audited删除后,queryA返回预期的实体列表。开启日志记录时,SQL查询看起来没问题:

    select
        u1_0.ID,
        u1_0.BUSINESS_KEY
    from
        A u1_0 
    where
        u1_0.BUSINESS_KEY=?;

直接在数据库中执行上述查询,无论是在之后还是在断点处暂停时执行,都会显示出预期的表记录。将查询改为按id而不是按businessKey时,确实能得到结果。

这是怎么回事?为什么开启审计会让Hibernate无法执行简单查询?

顺便说一句,Hibernate版本是6.2.46。

解决方案

都是我自己的错。Envers没有问题。

测试设置中存在一个回退机制,当首选的架构不可用时会悄悄切换架构。当开始事务时,这个回退被错误地触发,导致出现 "org.hibernate.MappingException: Could not instantiate id generator [entity-name=org.hibernate.envers.DefaultRevisionEntity]"

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章