我有以下简单的数据结构(为简洁起见省略了详细信息):
@Audited
@Entity
class SettingsGroup implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id
@OneToMany(mappedBy = "group", cascade = [CascadeType.ALL])
@OrderBy("key")
List<SettingsEntry> entries = []
}
@Audited
@Entity
class SettingsEntry implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Integer id
@ManyToOne
SettingsGroup group
}
我设置了 org.hibernate.envers.store_data_at_delete=true 标志。在获取 SettingsEntry 的修订后,它会在尝试从 _aud 表中延迟获取关联的组时抛出 EntityNotFoundException。
def reader = AuditReaderFactory.get(manager)
def query = reader.createQuery().forRevisionsOfEntity(SettingsEntry, false, true)
audits = query.resultList.collect {
//noinspection GroovyAssignabilityCheck
new AuditRevision<T>(entity:it[0], revision: it[1], type: it[2])
}
我查看了生成的 SQL,它似乎在尝试获取导致没有记录显示的父记录时过滤掉了删除修订类型:
select *
from settings_group_aud sg
where sg.rev=(
select max(sg2.rev) from settings_group_aud sg2 where sg2.rev<=3 and sg.id=sg2.id
) and sg.revtype<>2 and sg.id=1
表中有记录..只是最近的是删除:
select * from SETTINGS_GROUP_AUD;
ID NAME ENVIRONMENT KEY_NAME REV REVTYPE
1 test prod Default Key 2 0
1 test prod Default Key 3 2
(2 rows, 1 ms)
有没有办法调整 Envers 中的延迟初始化以防止过滤已删除的 rev 类型?那将解决我的问题。我只是没有看到任何可配置的东西。
我的另一个选择是再次关闭 org.hibernate.envers.store_data_at_delete,但如果可能的话,我更愿意继续使用它。这似乎有点像一个错误,但我是 Envers 的新手,所以也许我只是看错了:-)