在hibernate中调用commit方法时出现重复的条目错误

时间:2017-01-09 07:19:24

标签: hibernate concurrency exception-handling

我试图同时调用相同的API,即在db中的hibernate join表中创建一些行,并且某些列上有一些唯一约束。

@Entity
public class Customer {
...
 @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "CustomerProduct", joinColumns = { @JoinColumn(name = "cp_customer_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "cp_product_id", nullable = false, updatable = false) })
    @OrderBy("id")
    private Set<Product>   products = new HashSet<Product>(0);

...
}

@Entity
public class Product{

....
@ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "CustomerProduct", joinColumns = { @JoinColumn(name = "cp_product_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "cp_customer_id", nullable = false, updatable = false) })
    private Set<Customer> customers = new HashSet<Customer>(0);

....

}

cp_product_id + cp_customer_id是CustomerProduct表中的唯一键(Hiberante连接表)。我从这张表中得到例外。

 fun()
    {
    Product productDO = getById(....);
    // DO to DTO
    for (Customer cr : customerList) {
                    productDTO.customers.add(cr);
                }
   // DTO to DO
    saveOrUpdate()
    commit()
    }

在第一次通话中我得到了适当的回应。在第二次调用中,我在提交行中出错,它显示重复的条目。这是预期的,因为相同的密钥已保存在DB中,但我怎样才能避免此错误。 因为在saveOrUpdate之前已经检查了重复的密钥。 saveOrUpdate方法是否在DB中保留数据,或者仅在db中提交存储数据。

请告诉我任何好主意,以避免此错误。我是hibernate的新手,对saveorupdate和commit没有太多了解。

为什么hibernate乐观锁定无法解决这个问题?

0 个答案:

没有答案