JPA merge联合唯一索引无效问题解决方案

 更新时间:2020年09月19日 09:53:01   作者:贾树丙  
这篇文章主要介绍了JPA merge联合唯一索引无效问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

问题

JPA的merge()操作 是合并的意思,就是当保存的实体时,根据主键id划分,如果已存在,那么就是更新操作,如果不存在,就是新增操作

但是这个仅针对 主键id 划分,对联合唯一索引 无效,两次更新同一条语句还是会报错:

  Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement] with root cause
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1-1' for key 'UK_bing'

解决

有个简单的办法,就是先判断是否有这条数据,然后再决定是更新、还是增加,如下:

@Override
public void mergeCollection(Collection collection) {
  String hql = "select count(1) from Collection where userId = ?1 and topicId =?2";
  Query query = em.createQuery(hql)
      .setParameter(1, collection.getUserId())
      .setParameter(2, collection.getTopicId());
  Long num = (Long) query.getSingleResult();

  if (num > 0) {
    String hql2 = "update Collection set status = ?3 where userId = ?1 and topicId =?2";
    Query query2 = em.createQuery(hql2)
        .setParameter(1, collection.getUserId())
        .setParameter(2, collection.getTopicId())
        .setParameter(3, collection.getStatus());
    query2.executeUpdate();
  } else {
    em.merge(collection);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java动态规划方式解决不同的二叉搜索树

    Java动态规划方式解决不同的二叉搜索树

    二叉搜索树作为一个经典的数据结构,具有链表的快速插入与删除的特点,同时查询效率也很优秀,所以应用十分广泛。本文将详细讲讲二叉搜索树的原理与实现,需要的可以参考一下
    2022-10-10
  • YGC前后新生代是否变大分析详解

    YGC前后新生代是否变大分析详解

    要解释这个问题,我们先要弄清楚YGC的过程,parNew是新生代的gc算法,简单来说从gc roots开始扫描对象,当扫到一个只要是属于新生代的对象就将其挪到to space,但是老的对象还不会做释放,直到gc完成之后再看是否释放老的对象
    2022-01-01
  • 使用Filter过滤器中访问getSession()要转化

    使用Filter过滤器中访问getSession()要转化

    这篇文章主要介绍了使用Filter过滤器中访问getSession()要转化,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 总结Java常用到的六个加密技术和代码

    总结Java常用到的六个加密技术和代码

    大家要记住现代密码学最重要的原则柯克霍夫原则:数据的安全基于密钥而不是算法的保密。也就是说即使密码系统的任何细节已为人悉知,只要密匙未洩漏,它也应是安全的。这篇文章给大家介绍了6个常用的加密技术和代码。
    2016-07-07
  • JVM的垃圾回收机制真是通俗易懂

    JVM的垃圾回收机制真是通俗易懂

    这篇文章主要为大家详细介绍了JVM的垃圾回收机制,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Java的反射机制之获取class详解

    Java的反射机制之获取class详解

    这篇文章主要介绍了Java的反射机制之获取class详解,Class类表示一个类或接口的元数据,通过它可以获取到类或接口的构造函数、方法、字段、注解等信息,也能够创建对象、调用方法等,需要的朋友可以参考下
    2023-09-09
  • 解决打开的idea项目maven不生效问题

    解决打开的idea项目maven不生效问题

    这篇文章主要给大家介绍了关于如何解决打开的idea项目maven不生效问题,最近在配置maven时,发现无论配置几遍,IDEA中的maven配置总会还原成默认的,所以这里给大家分享下解决办法,需要的朋友可以参考下
    2023-07-07
  • 解决nacos项目启动报错:Connection refused: no further informa问题

    解决nacos项目启动报错:Connection refused: no further&

    这篇文章主要介绍了解决nacos项目启动报错:Connection refused: no further informa问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Spring Boot启动过程全面解析(三)

    Spring Boot启动过程全面解析(三)

    这篇文章主要介绍了Spring Boot启动过程全面解析(三)的相关资料,需要的朋友可以参考下
    2017-04-04
  • 如何修改HttpServletRequest中header中的信息

    如何修改HttpServletRequest中header中的信息

    这篇文章主要介绍了如何修改HttpServletRequest中header中的信息,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02

最新评论