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

BatchUpdateException重复键值违反了唯一约束

曹茂材
2023-03-14

我必须交换同一表的不同行的属性。
有一列“reference_id”在 DB 中具有唯一的约束。

代码:

A 级-

@Override
@Transactional
@ResponseBody
@RequestMapping(value = "/cust/{fromCustId}/{toCustId}/swapCusts", method = { RequestMethod.PUT })
public void swapContents(@PathVariable("fromCustId") final long fromCustId, @PathVariable("toCustId") final long toCustId) throws InvalidCustException
{           
    custService.swapContents(fromCustId, toCustId);     
}

B级-

 @Override
          public void swapContents(long fromCustId, long toCustId) throws InvalidCustException {
           try {
            CustEntity fromCustEntity = custManager.findByPrimaryKey(fromCustId);
            CustEntity toCustEntity = custManager.findByPrimaryKey(toCustId);

            if (null == fromCustEntity || null == toCustEntity) {
             throw new InvalidCustException("Either fromCustId=[" + fromCustId + "] or toCustId=[" + toCustId + "] is invalid");
            }

            String fromCust_RefId = fromCustEntity.getReferenceId();
            String fromCust_Password = fromCustEntity.getPassword();

            String toCust_RefId = toCustEntity.getReferenceId();
            toCustEntity.setReferenceId("##" + toCust_RefId);
            custManager.merge(toCustEntity);

            fromCustEntity.setReferenceId(toCust_RefId);
            fromCustEntity.setPassword(toCustEntity.getPassword());


            toCustEntity.setReferenceId(fromCust_RefId);
            toCustEntity.setPassword(fromCust_Password);

            custManager.merge(fromCustEntity);
            custManager.merge(toCustEntity);

           } catch (Exception e) {
            throw new RuntimeException(e.getMessage(), e);
           }
          }

异常跟踪:

   2016-11-24 15:14:26,772 WARN  [http-nio-8093-exec-8] or.hi.en.jd.sp.SqlExceptionHelper (SqlExceptionHelper.java:144) - SQL Error: 0, SQLState: null 2016-11-24 15:14:26,774 ERROR [http-nio-8093-exec-8] or.hi.en.jd.sp.SqlExceptionHelper (SqlExceptionHelper.java:146) - PerfPreparedStatement.executeBatch - update cust set  password='30ca904c-f720-4994-9e1a-dc5153c1cd85', reference_id='3355efa8-53df-4220-be32-752ce9a54645', cust_uuid=? where cust_id=82737521 2016-11-24 15:14:26,780 ERROR [http-nio-8093-exec-8] or.hi.en.jd.ba.in.BatchingBatch (BatchingBatch.java:141) - HHH000315: Exception executing batch [could not execute batch] 2016-11-24 15:14:26,822 WARN  [http-nio-8093-exec-8] co.gr.en.pu.ut.CommonExceptionConverterLogic (CommonExceptionConverterLogic.java:139) - org.hibernate.exception.GenericJDBCException: could not execute batch for User ID: 805, Request ID: b9167f59-87ee-498e-8aba-f505d2dea195, clientIP: 10.201.141.120 method: PUT uri: /custApi/services/cust/82737521/82737513/swapCusts, Request Parameters: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "tuc_cust_1"   Detail: Key (reference_id)=(41e24e58-a108-4f12-9b6b-4250a7a379e5) already exists.      
   at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157)      
   at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1886) [wrapped] java.sql.BatchUpdateException: Batch entry 0 update cust set password='530a32c1-eba5-4de8-8e85-97d3af62c331', reference_id='41e24e58-a108-4f12-9b6b-4250a7a379e5', cust_uuid=? where cust_id=82737513 was aborted.  Call getNextException to see the cause.      
   at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2746)      
   at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1887)      
   at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:405)      
   at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2893)      
   at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723) [wrapped] java.sql.SQLException: PerfPreparedStatement.executeBatch - update cust set password='30ca904c-f720-4994-9e1a-dc5153c1cd83', reference_id='3355efa8-53df-4220-be32-752ce9a54645', cust_uuid=? where cust_id=82737521

共有1个答案

司英彦
2023-03-14

尝试在合并之间刷新实体管理器。

 类似资料:
  • 我在django应用程序中创建了一个模型,并从pgadmin将数据填充到表中,但现在当我试图从应用程序创建记录时,它抛出了这个完整性错误: 重复的键值违反了唯一约束“packsapp_foo_pkey” 详细信息:键(id)=(4)已经存在。 这是models.py 我是否总是必须从应用程序本身插入数据? Views.py

  • 我有一个笑话模型: 现在,当我试图迁移最后一行时,我得到了错误。基本上,我想将一个用户链接到Joke对象,因为我已经有了一个数据库,所以我希望默认值为1,这是管理员用户的id(我检查过了...).Makemigrations工作正常,但是当我尝试迁移时,我得到了这个: 我真的不明白怎么了。有什么想法吗?

  • 我在创建应用程序时遇到了这个问题。因此,每当我添加第一条评论时,问题都不会出现,但当我第二次尝试时,我会收到此错误: 重复的键值违反了唯一约束“tripplanner_discussion_author_id_key”详细信息:键 (author_id)=(1) 已存在。 我试图把放到 models.py,但它根本没有帮助。 models.py views.py 更新 当我登录到另一个用户时,一个

  • 我正在使用django和精神来构建一个网站。在一次测试中,当我将新数据插入一个名为的表时,我得到了以下错误: 请注意,表中已经有另外两条 id 为 和 。因此,插入当然行不通。但是执行的 sql 不包含 字段。也就是说, 是由 postgresql 自动生成的,为什么它生成一个已经存在的 ID? 为了找出原因,我在postgresql中运行了以下命令: 因此,基本上,是,因此postgresql每

  • 卡住了,我有一个数据库,当我试图让时,它给出了这个错误,如下所示: 以下是整个错误:

  • 当并发客户机试图将数据插入子表时,我们面临唯一的约束冲突问题。 假设我们有1以下的表格。用户user_id、first_name、last_name。2.项目project_idproject_name和project_description。 两者都有着多对多的关系。 当两个客户端试图创建一个新用户时。假设client1创建了user1(id=aa1),子记录项目(id=1)。Client2还创