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内の遅延初期化を微調整する方法はありますか?それは私の問題を解決するでしょう。構成可能なものが何も表示されていません。

私の他のオプションは、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 に答える