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

5f21b83631127c88fef2639d476b9cf3.png

问题

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);

}

}

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

原文链接:https://www.cnblogs.com/acm-bingzi/p/jpa_merge.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值