2012-11-06 45 views
2

我有以下簡單的數據結構(細節不再贅述):休眠Envers投擲EntityNotFoundException當獲取刪除父對象

@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修訂,就會拋出EntityNotFoundException試圖偷懶從_aud表中提取關聯的組。

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所以也許我只是看着這一切錯:-)

回答

2

不幸的導航已刪除的實體的圖形時,看起來像一個錯誤。請報告至https://hibernate.onjira.com/secure/Dashboard.jspa

的解決方案可能會不選擇在查詢中被刪除的實體:forRevisionsOfEntity(SettingsEntry,假的,假的)。這個列表的最後一個元素將是它被刪除時的實體。

+0

謝謝,我會提交錯誤報告。看起來像一個邊緣情況。 –

+0

廣告同樣的問題,(假的,假的)解決了這個問題 – phury