gpt4 book ai didi

java - 在多线程程序中处理更新 hibernate

转载 作者:行者123 更新时间:2023-12-01 04:33:48 25 4
gpt4 key购买 nike

我在多线程程序中运行以下代码并得到异常:-

org.hibernate.exception.ConstraintViolationException: ERROR: duplicate key value violates unique constraint "value_pkey"

    @Stateless
@TransactionAttribute(javax.ejb.TransactionAttributeType.REQUIRED)
public class GetHelloBean{
@PersistenceContext(unitName = "test-unit")
private EntityManager entityManager;

public Hello<?> insertOrUpdateHello(Hello<?> value) {
Hello<?> existing = null;
try {
existing = this.entityManager.find(Hello.class,
value.getKey());
if (existing != null) {
value = this.entityManager.merge(value);
} else {
this.entityManager.persist(value);
}
this.entityManager.flush();
} catch (Exception e) {
this.logger.error(" value not saved : " + value.toString()
+ " of class " + value.getClass() + ":" + e.getMessage());
}

//

return value;
}

}

有人可以解释一下为什么以及我该如何处理这个问题吗?

最佳答案

此错误可能是由代码中的竞争条件引起的。如果两个或多个线程尝试使用相同的键更新 Hello 实体,它们可能都会从 find 返回 null 并尝试保留该实体。因此,只有“最快”的线程才会成功,而其他线程则会遇到约束违规。

如果 value.getKey() 是 Hello 实体的主键,则仅执行 merge(...) 就足够了。 Hibernate 将检查实体是否已存在于数据库或缓存中,并根据情况执行 INSERT 或 UPDATE。不过,并发执行仍然可能会产生意外结果(感知到无序更新)。

如果它不是 Hello 实体的主键,可能 this answer可以帮助你。

关于java - 在多线程程序中处理更新 hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17596427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com