1. 程式人生 > 程式設計 >JPA merge聯合唯一索引無效問題解決方案

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。