2012-08-08 56 views
3

我有以下設置:存在各種實體(Projects,Tests,Users),然後有TestReportsTestReports引用其他實體以及文件系統中的一些額外數據。在JPA/Hibernate中引用已刪除的實體

生成報告並且從不刪除(用於審覈目的)。但是,其他實體可以被刪除。這導致情況,當報告引用一些被刪除的實體時。從業務角度來看,這是可以的,報告可以只顯示[deleted id123]而不是刪除實體標籤,這樣可以。但是,我得到javax.persistence.EntityNotFoundException,當我嘗試加載引用刪除實體的報告。

有沒有辦法告訴Hibernate/JPA在這種情況下創建帶有ID和一些isDeleted標誌的幻象對象?我在Hibernate Envers文檔中發現它們在遍歷修訂歷史時支持類似的內容,但我還沒有找到在「普通」實體中使用它的方法。

從Envers文檔:

第二個參數,selectDeletedEntities,則指定的修改,其中,所述實體被刪除應包含在結果中。如果是,那麼這些實體將具有修訂類型DEL以及除id,null之外的所有字段。

我知道解決辦法的通過對所有對象引入deleted標誌和使用缺失,如果不是實際的刪除。但是這增加了額外的開銷,我想避免。

回答

4

我不確定這是你在找什麼。您可以通過使用@NotFound(action=NotFoundAction.IGNORE)註釋來告訴hibernate在字段上設置null,而不是放棄EntityNotFoundException。沒有太多關於它的文檔,你可以找到如何使用它here

+0

謝謝,這似乎幾乎是我想要的。你知道如果有一個標準的方式如何區分實際沒有參考和忽略未找到? – Michal 2012-08-08 09:51:07

+0

我不知道,我不認爲休眠提供這樣的設施:S。 – Augusto 2012-08-08 09:59:04

0

我也有類似的情況,我做了這個:
我從不刪除這些東西。相反,我爲那些被刪除的人設置了一個deletion time。加載數據時,對象被成功獲取,但當我檢查他們的deletion time時,我顯示[deleted]

然而,這是我提出的解決方案,你可能會發現另一個。

修訂
你可以試試這一個,以及:
捕捉javax.persistence.EntityNotFoundException和手動插入任何你喜歡的值到該字段。在這種情況下,您可以看到哪些被刪除,哪些實際上沒有參考。

+0

謝謝,你的解決方案肯定提供了更多的靈活性,但對我來說可能是矯枉過正。 – Michal 2012-08-08 09:52:20

+0

我更新了我的答案。這個可能適合你。 – 2012-08-08 09:57:39

+0

我可能會錯過某些東西,但我不明白,在調用query.getResultList()時,如何通過捕獲'EntityNotFoundException'來幫助自己。 – Michal 2012-08-09 08:40:02