Как узнать, какой элемент вызывает ошибку транзакции в Hibernate / Spring Data? - PullRequest
0 голосов
/ 28 мая 2020

Использование Spring 2.2.5 с данными Spring / JPA / Hibernate.

При использовании CrudRepository со структурой CrudRepository#saveAll() или al oop с индивидуальным CrudRepository#save() кажется невозможным сказать, какой из элементы нарушают ограничение.

Предполагая, что этот метод:

@Transactional
public void storeAll(Collection<Attribute> attributes) {
    repository.saveAll(attributes);
}

Возвращается DataIntegrityViolationException с вложенным спящим режимом ContraintViolationException. Кажется, что в указанных исключениях нет ссылок на сущность.

Использование al oop тоже не работает:

@Transactional
    public void storeAll(Collection<Attribute> attributes) {
        for(Attribute attribute : attributes){
            try{
                repository.save(attribute);
            }catch (Exception e){
                ///
            }
        }
    }

Исключение внутри l oop не быть пойманным (метод save ничего не бросает). Вместо этого он выдается при возврате из метода. Может из-за какой-то оптимизации?

1 Ответ

0 голосов
/ 28 мая 2020

Если у ваших объектов есть идентификатор (идентификатор, уникальный код и т. Д. c), вы можете окружить код блоком try/catch и посмотреть, какие объекты вызывают проблему:

private void saveMyObjects (List<MyObject> myObjects) {
  for (MyObject myObject: myObjects) {
    try {
      this.myObjectRepository.save(myObject);
    } catch (Exception e) {
      //To be more specific: 
      // } catch (DataIntegrityViolationException e) {
      system.out.println("I have a problem with this object: " + myObject.getMyIdentifier());
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...