当前位置: 首页 > 知识库问答 >
问题:

多线程程序中的句柄更新hibernate

司徒瀚
2023-03-14

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

org.hibernate.exception.约束违反异常:错误:重复的键值违反唯一约束"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;
    }

}

有人能解释一下为什么以及我该如何处理这件事吗?

共有1个答案

哈襦宗
2023-03-14

此错误可能是由代码中的竞争条件引起的。如果两个或多个线程试图用相同的键更新Hello实体,则它们可能都从查找返回了一个null,并将尝试持久化该实体。因此,只有“最快”的线程会成功,而其他线程会遇到约束冲突。

如果value.getKey()是Hello实体的主键,那么只执行合并(...)就足够了。Hibernate将检查该实体是否已经存在于数据库或缓存中,并根据此执行INSERT或UPDATE。尽管并发执行仍然可能产生意想不到的结果(感知到乱序更新)。

如果它不是Hello实体的主键,也许这个答案可以帮助您。

 类似资料:
  • 问题内容: 线程ID和线程句柄有什么区别?为什么两者都需要?Windows和Linux之间有区别吗? 问题答案: 据我所知,Linux的pthread库没有线程句柄的概念。pthread_create和其他pthreads函数,返回线程ID。 在Windows下,线程句柄不同于线程ID,就像文件句柄不同于文件名一样。 线程句柄是一个令牌,它使您可以对线程执行某些操作(通常等待或杀死它)。Win32

  • 问题内容: 嘿,SO Guru的即时通讯工作非常顺利, 当我第一次运行程序时,它尝试运行代码时遇到此错误 经过一番摸索,这似乎是线程通常会发生的错误,为什么它们尝试同时访问同一资源,但这就是让我在该系统中根本不使用多线程的原因。 有人可以解释为什么会这样,还是想办法解决它 非常感谢^ _ ^ 问题答案: 您可以修改底层的(这是隐藏在环)。正确的方法是:

  • 我在准备好的语句中使用了命令,当我在单线程环境中执行它时,它的工作很好,但是在多线程环境中,它会引起一些问题,那就是数据重复,即如果我有5个线程,每个记录会重复5次,我认为db中没有锁来帮助线程。我的代码: 如果employee.size=5,thread count=5,执行后我将得到25条记录,而不是5条

  • 问题内容: 我刚刚开始进行android开发,并且更新UI确实使我很烦:/ 到目前为止,这是我一直在努力的工作- 它工作正常,但是每个人都说要在主线程中做图形,所以我正在尝试(但失败)将其传递给另一个线程。麻烦的是,我真的不知道怎么做,因为我从未真正使用过线程。 Google给出的有关使用Threads的示例似乎并不十分清楚,我也无法真正按照自己的意愿去做。我可以请某人在这里给我一个最基本的例子,

  • 问题内容: 我研究了一段时间,以查找有关 如何使用PyQT执行多线程程序的 信息 ,并更新了GUI以显示结果 。 我习惯于通过示例学习,但我找不到(是的,我找了好几个星期)使用多线程执行此简单任务的程序的任何简单示例,例如连接到www网站列表(5个线程)并只是打印处理带有响应代码的网址。 任何人都可以共享代码或让我进入解释此类程序的出色教程吗? 问题答案: 这里有一些非常基本的例子。 您可以将对G