@已审计的废墟查询
我正在为一个新模块添加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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。