【问题标题】:Jpa merge throws StaleObjectStateException?Jpa 合并抛出 StaleObjectStateException?
【发布时间】:2019-04-04 08:04:24
【问题描述】:

有代码,当我尝试创建四个客户时。 1.将Customer1,2写入数据库 2.合并Customer3(具有相同的ID,如1) 3.合并Customer4(再次具有相同的ID) 我想创建同一实体的任何版本

所以,

public static void main(String[] args) {
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("Info");
        EntityManager entityManager = entityManagerFactory.createEntityManager();

        Customer customer1 = new Customer("1", "Vladislav");
        Customer customer2 = new Customer("2", "Maria");
        Customer customer3 = new Customer("1", "Ekaterina");
        Customer customer4 = new Customer("1", "Helen");

        entityManager.getTransaction().begin();
        entityManager.persist(customer1);
        entityManager.persist(customer2);
        entityManager.getTransaction().commit();

        entityManager.getTransaction().begin();
        entityManager.merge(customer3);
        entityManager.getTransaction().commit();

        entityManager.getTransaction().begin();
        entityManager.merge(customer4);
        entityManager.getTransaction().commit();

        //get versions here:
        entityManager = entityManagerFactory.createEntityManager();
        AuditReader auditReader = AuditReaderFactory.get(entityManager);
        List<Number> versions = auditReader.getRevisions(Customer.class, "1");
        System.out.println("========");
        System.out.println(Arrays.toString(versions.toArray()));

        entityManager.close();
        entityManagerFactory.close();
    }

客户实体:

package entity;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.envers.Audited;

import javax.persistence.*;


@Getter
@Setter
@NoArgsConstructor
@Entity
@Audited
public class Customer {
    @Id
    @Column(length = 100, nullable = false)
    private String id;
    private String name;

    @Version
    int version;

    public Customer(String id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", version=" + version +
                '}';
    }
}

当我只保留客户 1,2 并合并客户 3 时 - 一切正常。

但在我添加与 customer4 实体的合并时 - 出现错误消息 -

线程“主”javax.persistence.OptimisticLockException 中的异常:行已被另一个事务更新或删除(或未保存的值映射不正确):[entity.Customer#1] 原因:org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确):[entity.Customer#1] ... 2 更多

为什么我不能合并任何时间?

【问题讨论】:

  • 能否贴出客户实体的代码?
  • @aka-one 更新

标签: java hibernate jpa


【解决方案1】:

您只能将客户与具有最新版本的实例合并。

customer1 具有 version=0

id = '1' 的当前版本现在是 0

customer3 具有 version=0,因此可以合并,合并后 version=1

id = '1' 的当前版本现在是 1

customer4 具有 version=0,因此无法再合并。

【讨论】:

  • 将 id=1 的实体更新到版本 2 的最佳方法是什么?如何相应地更新同一实体并升级它的版本?
  • @VladislavOsipenkov 使用EntityManager.find 然后修改名称
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多