我有以下设置:有各种实体(Projects
,Tests
,Users
),然后有TestReports
。 TestReports
引用其他实体以及文件系统中的一些额外数据。
生成报告并且永远不会删除报告(用于审计目的)。但是,可以删除其他实体。当报告引用一些已删除的实体时,这会导致这种情况。从商业角度来看,这是可以的,报告可以只显示[deleted id123]
而不是已删除的实体标签,这样就可以了。但是,当我尝试加载引用已删除实体的报告时,我收到javax.persistence.EntityNotFoundException
。
有没有办法告诉Hibernate / JPA在这种情况下只创建带有ID和一些isDeleted
标志的幻像对象?
在Hibernate Envers文档中,我发现它们在遍历修订历史时会支持类似的内容,但我还没有找到在“普通”实体中使用它的方法。
来自Envers文档:
第二个参数selectDeletedEntities指定是否应在结果中包含删除实体的修订版本。如果是,则此类实体将具有修订类型DEL和除id,null之外的所有字段。
我通过在所有对象上引入deleted
标志来了解解决方法,并使用if for soft 删除,而不是实际删除。但这增加了额外的开销,我想避免。
答案 0 :(得分:4)
我不确定这是不是你正在寻找的东西。您可以通过使用@NotFound(action=NotFoundAction.IGNORE)
注释告诉hibernate在字段上设置null而不是调整EntityNotFoundException。关于它的文档不多,您可以找到如何使用它here。
答案 1 :(得分:0)
我有类似的情况,我这样做了:
我从不删除这些东西。相反,我为那些被删除的人设置deletion time
。加载数据时,会成功提取对象,但当我检查deletion time
时,我会显示[deleted]
。
然而,这是我提出的解决方案,你可能会找到另一个。
<强>已更新强>
你也可以尝试这个:
捕获javax.persistence.EntityNotFoundException
并手动将您喜欢的任何值插入该字段。在这种情况下,您可以看到哪些被删除,哪些实际上没有参考。