【问题标题】:Referencing deleted entities in JPA/Hibernate在 JPA/Hibernate 中引用已删除的实体
【发布时间】:2012-08-08 09:19:26
【问题描述】:

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

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

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

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

来自 Envers 文档:

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

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

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这似乎是我想要的。你知道是否有一种标准方法来区分实际没有参考和忽略的未找到?
    • 我不知道,我不认为 hibernate 提供这样的功能:S.
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢,您的解决方案确实提供了更大的灵活性,但对我来说可能有点矫枉过正。
    • 我可能会错过一些东西,但我不明白,在调用 `query.getResultList()' 时如何通过捕获 EntityNotFoundException 来帮助自己。
    • 出现异常时,表示该实体不存在,对吧?因此,您可以手动拥有具有所需值的该实体的实例。
    • query.getResultList() 返回TestRuns 的列表,当它抛出EntityNotFoundException 时,基本上意味着,其中一个TestRuns 引用了已删除的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多