【问题标题】:How to change version without updating entity data in optimistic_force_increment hibernate jpa?如何在不更新optimistic_force_increment hibernate jpa中的实体数据的情况下更改版本?
【发布时间】:2017-11-10 06:58:09
【问题描述】:

我是 Hibernate JPA 的新手。 据我了解hibernate jpa中的optimistic_force_increment:如果在更新实体提交时实体在事务中的任何位置更新,它会更新数据库中的版本字段列。

现在我的问题是,有没有办法在不更新实体内部任何数据的情况下更新@version 字段?

非常感谢代码 sn-p 或执行相同操作的示例。

【问题讨论】:

  • 这样做的原因是什么?测试?你想更新实体本身的版本字段还是只更新数据库?
  • 基本上有一些外部实体不是当前实体的外键,而是使用当前实体的数据。在并发上下文中,我想锁定实体而不更改其数据。
  • 我还没有完全理解您为什么要这样做,但这听起来像是解决您遇到的问题的一种解决方法。你为什么不进一步分析问题而不是以反模式的方式实现。如果我理解正确,您可能需要一个 dto(数据传输对象)。
  • 不理解它并不能使它成为反模式;)

标签: java database hibernate jpa locking


【解决方案1】:

有一种解决方法:你可以驱逐实体并将其添加到会话中,看看这个 sn-p:

    public void forceUpdate(Object aEntity) {
        getHibernateTemplate().execute(new HibernateCallback<Void>() {
            @Override
            public Void doInHibernate(Session aSession) throws HibernateException {
                if (aSession.contains(aEntity)) {
                    aSession.evict(aEntity);
                }
                aSession.update(aEntity);
                return null;
            }
        });
    }

【讨论】:

    【解决方案2】:

    看这篇文章: https://thorben-janssen.com/hibernate-tips-increase-version-parent-entity-updating-child-entity/

    为了增加版本而不更新,作者提出以下建议:

    TypedQuery q = em.createQuery("SELECT b FROM Book b WHERE b.id = 1", Book.class);
    q.setLockMode(LockModeType.OPTIMISTIC_FORCE_INCREMENT);
    Book b = q.getSingleResult();
    

    另外看看这篇文章,它也处理了这个问题,并提出了如何通过事件侦听器自动完成: https://vladmihalcea.com/how-to-increment-the-parent-entity-version-whenever-a-child-entity-gets-modified-with-jpa-and-hibernate/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      相关资源
      最近更新 更多