【问题标题】:Remove selected entites from being updated in the transaction using hibernate/JPA使用 hibernate/JPA 删除事务中更新的选定实体
【发布时间】:2021-11-30 05:28:24
【问题描述】:

我的要求是 - 基于属性文件中标志的值(例如,skipDbUpdate),我想保存/更新实体或在正在进行的事务中跳过这些实体。 我已经在实体上实现了一个侦听器,如果此标志为真,它将引发异常,但现在我必须增强此行为以不引发错误但跳过实体的更新。我尝试了以下选项:

  1. 实体上的@Immmutable 注释 - 我无法基于此标志,应用程序使用 spring,但我无法将 @ConditionalOnProperty 注释与 @Entity 和 @Immutatble 注释结合起来。

@Entity @Immutatble public class EntityA {}

  1. 在 @Column 注释内实体的每个字段上使用 updateable=false, insertable=false - 再次,我无法基于此标志(原因与上述相同)。

    @Column(insertable = false, updatable = false)

  2. 当标志为真时,在侦听器中调用 entityManager.detach(o) 方法,如此问题中所建议的 - How to make an Entity read-only? 但这是试图从其他事务中保存实体并抛出错误 - “ java.lang.RuntimeException: org.hibernate.HibernateException: Found two representations of same collection:"

由于这是只使用 spring 的旧代码库,我不能那么容易地使用注释。

请建议哪种方式是满足此要求的最佳方式?

谢谢

【问题讨论】:

    标签: java hibernate spring-mvc jpa transactions


    【解决方案1】:

    假设您使用的是 CRUDRepository,您可以扩展接口并覆盖 save 方法,并且在此方法中,您可以检查 foe 标志,如果 skipDb 然后什么也不做,调用 super.save(….)

    【讨论】:

    • 这种方法让我可以处理调用 save() 或 saveOrUpdate() 方法的情况,但是当这个实体通过级联关系在其他实体中使用时,它会按原样保存它们。这是现在的问题。
    • 在这种情况下,如果可能,请删除级联并通过单独调用 save/update 在服务方法中处理它
    • 这些实体在整个项目中的多个地方使用,所以这将是巨大的变化。这就是为什么我正在寻找只能在实体级别进行管理的选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多