首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jpa合并抛出StaleObjectStateException?

Jpa合并抛出StaleObjectStateException?
EN

Stack Overflow用户
提问于 2018-10-31 07:46:47
回答 1查看 589关注 0票数 0

有代码,当我试图创建四个客户时。1.将Customer3 1,2写入数据库;2.合并Customer3(具有相同的id,例如1);3. merget Customer4(再次使用相同的id )--我想创建相同实体的任何版本

所以,

代码语言:javascript
复制
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();
    }

客户实体:

代码语言:javascript
复制
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实体中添加了mergin -有错误消息occours -

线程"main“javax.persistence.OptimisticLockException: Row中的异常被另一个事务更新或删除(或未保存的值映射不正确):由: org.hibernate.StaleObjectStateException: Row引起的entity.Customer#1被另一个事务更新或删除(或未保存-值映射不正确):entity.Customer#1 .

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-31 10:03:24

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

customer1version=0

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

customer3version=0,因此合并是可能的,并在合并version=1之后进行。

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

customer4version=0,因此不再可能合并。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53078560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档