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);
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。