【问题标题】:Updating two objects in the same transaction在同一事务中更新两个对象
【发布时间】:2015-01-25 08:36:31
【问题描述】:

我有两个类定义如下:

public class CallDetail {

@OneToMany(mappedBy = "callDetail", cascade = CascadeType.ALL, orphanRemoval = true)
    private Set<Task> tasks = new HashSet<Task>();

}

public class Task {

    @ManyToOne
    private CallDetail callDetail;

    @OneToMany
    private Set<Task> preRequisiteTask = new HashSet<Task>();
}

我有两个 CallDetail 类对象,它们已经在数据库中。然后我尝试在服务层进行以下更新:

Task countStock = new Task();
Task takeOrder = new Task();
takeOrder.getPreRequisites().add(countStock);

callOne.getTaskInstances.add(countStock);
callTwo.getTaskInstances.add(taskOrder);

try {
        callDetailService.updateCallDetail(callOne);
        isValid = true;
    }catch(Exception e) {
        e.printStackTrace();
    }
if (isValid) {
            callDetailService.updateCallDetail(callDetail);
        }

更新运行时,我得到的错误是:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: za.co.itdynamics.ccs.domain.Task

当两个 CallDetail 对象相互关联时(其中 callOne 中的 takeOrder 具有 callTwo 中的 countStock 的先决条件),如何防止发生此错误?是否可以在一个事务中更新两个 CallDetail 对象(callOne 和 callTwo)?

【问题讨论】:

    标签: java spring hibernate jpa-2.0


    【解决方案1】:

    preRequisiteTask添加级联:

    @OneToMany(cascade = CascadeType.ALL)
    private Set<Task> preRequisiteTask = new HashSet<Task>();
    

    【讨论】:

      【解决方案2】:

      当然你必须从头开始一个事务(@Transactional

      然后你需要持久化这两个任务。至少有两种方式:

      • CascadeType.PERSIST(或.ALL)添加到@OneToMany 关系中,或
      • 调用EntityManager.persist(countStock)EntityManager.persist(takeOrder)将它们添加到已经存在的实体中。

      (我更喜欢第二种方式。)

      【讨论】:

        猜你喜欢
        • 2015-10-10
        • 2018-01-14
        • 2020-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-24
        相关资源
        最近更新 更多