私は次の単純なデータ構造を持っています(簡潔にするために詳細は省略されています):
@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を初めて使用するので、これをすべて間違って見ているだけかもしれません:-)