2

我有以下简单的数据结构(为简洁起见省略了详细信息):

@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 的新手,所以也许我只是看错了:-)

4

1 回答 1

2

不幸的是,在浏览已删除实体的图表时,这看起来像是一个错误。请向https://hibernate.onjira.com/secure/Dashboard.jspa报告。

解决方案可能不是在查询中选择已删除的实体:forRevisionsOfEntity(SettingsEntry, false, false)。列表的最后一个元素将是删除时的实体。

于 2012-11-07T19:42:32.287 回答