【发布时间】:2012-08-08 09:19:26
【问题描述】:
我有以下设置:有各种实体(Projects、Tests、Users),然后是TestReports。 TestReports 引用了其他实体以及文件系统中的一些额外数据。
报告会生成并且永远不会被删除(出于审计目的)。但是,可以删除其他实体。当报告引用某些已删除的实体时,这会导致这种情况。从业务的角度来看这没问题,报告可以只显示[deleted id123] 而不是删除的实体标签,这样就可以了。但是,当我尝试加载引用已删除实体的报告时,我收到了javax.persistence.EntityNotFoundException。
在这种情况下,有没有办法告诉 Hibernate/JPA 只创建带有 ID 和一些 isDeleted 标志的幻像对象?
在 Hibernate Envers 文档中,我发现它们在遍历修订历史时支持类似的东西,但我还没有找到在“正常”实体中使用它的方法。
来自 Envers 文档:
第二个参数 selectDeletedEntities 指定是否应将删除实体的修订包含在结果中。如果是,则此类实体将具有修订类型 DEL 和除 id 之外的所有字段,null。
我知道解决方法是在所有对象上引入deleted 标志并使用 if 进行 soft 删除,而不是实际删除。但这会增加额外的开销,我想避免这种情况。
【问题讨论】: