3

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

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

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

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

来自 Envers 文档:

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

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

4

2 回答 2

4

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

于 2012-08-08T09:24:52.527 回答
0

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

但是,这是我想出的解决方案,您可能会找到另一个解决方案。

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

于 2012-08-08T09:41:06.653 回答