在JPA / Hibernate中引用已删除的实体

时间:2012-08-08 09:19:26

标签: hibernate jpa

我有以下设置:有各种实体(ProjectsTestsUsers),然后有TestReportsTestReports引用其他实体以及文件系统中的一些额外数据。

生成报告并且永远不会删除报告(用于审计目的)。但是,可以删除其他实体。当报告引用一些已删除的实体时,这会导致这种情况。从商业角度来看,这是可以的,报告可以只显示[deleted id123]而不是已删除的实体标签,这样就可以了。但是,当我尝试加载引用已删除实体的报告时,我收到javax.persistence.EntityNotFoundException

有没有办法告诉Hibernate / JPA在这种情况下只创建带有ID和一些isDeleted标志的幻像对象?

在Hibernate Envers文档中,我发现它们在遍历修订历史时会支持类似的内容,但我还没有找到在“普通”实体中使用它的方法。

来自Envers文档:

  

第二个参数selectDeletedEntities指定是否应在结果中包含删除实体的修订版本。如果是,则此类实体将具有修订类型DEL和除id,null之外的所有字段。

我通过在所有对象上引入deleted标志来了解解决方法,并使用if for soft 删除,而不是实际删除。但这增加了额外的开销,我想避免。

2 个答案:

答案 0 :(得分:4)

我不确定这是不是你正在寻找的东西。您可以通过使用@NotFound(action=NotFoundAction.IGNORE)注释告诉hibernate在字段上设置null而不是调整EntityNotFoundException。关于它的文档不多,您可以找到如何使用它here

答案 1 :(得分:0)

我有类似的情况,我这样做了:
我从不删除这些东西。相反,我为那些被删除的人设置deletion time。加载数据时,会成功提取对象,但当我检查deletion time时,我会显示[deleted]

然而,这是我提出的解决方案,你可能会找到另一个。

<强>已更新
你也可以尝试这个:
捕获javax.persistence.EntityNotFoundException并手动将您喜欢的任何值插入该字段。在这种情况下,您可以看到哪些被删除,哪些实际上没有参考。