JPA merge联合唯一索引无效问题解决方案
问题
JPA的merge()操作是合并的意思,就是当保存的实体时,根据主键id划分,如果已存在,那么就是更新操作,如果不存在,就是新增操作
但是这个仅针对主键id划分,对联合唯一索引无效,两次更新同一条语句还是会报错:
Requestprocessingfailed;nestedexceptionisjavax.persistence.PersistenceException:org.hibernate.exception.ConstraintViolationException:couldnotexecutestatement]withrootcause
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:Duplicateentry'1-1'forkey'UK_bing'
解决
有个简单的办法,就是先判断是否有这条数据,然后再决定是更新、还是增加,如下:
@Override publicvoidmergeCollection(Collectioncollection){ Stringhql="selectcount(1)fromCollectionwhereuserId=?1andtopicId=?2"; Queryquery=em.createQuery(hql) .setParameter(1,collection.getUserId()) .setParameter(2,collection.getTopicId()); Longnum=(Long)query.getSingleResult(); if(num>0){ Stringhql2="updateCollectionsetstatus=?3whereuserId=?1andtopicId=?2"; Queryquery2=em.createQuery(hql2) .setParameter(1,collection.getUserId()) .setParameter(2,collection.getTopicId()) .setParameter(3,collection.getStatus()); query2.executeUpdate(); }else{ em.merge(collection); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。