Spring / Hibernate - игнорировать повторяющиеся записи и продолжить вставку - PullRequest
0 голосов
/ 06 октября 2018

Я занимаюсь разработкой приложения в среде Spring Boot и использую Hibernate для сохранения данных.В этом случае:

  • транзакции управляются Spring автоматически.
  • мой модуль DAO помечен примечаниями @Transactional и @Repository.
  • Я используюEntityManager вызывается в модуле DAO с аннотацией @PersistenceContext.
  • Моя БД - MySQL

У меня есть один метод в модуле DAO, который вставляет несколько записей в таблицу:

@Override
public void insertMultiplePippo(List<Pippo> pl) throws PippoException{
    try {
        for (Pippo p : pl) {
            try {
                entityManager.persist(p);
            } catch (MySQLIntegrityConstraintViolationException e) {
/*please enter HERE :) -->*/ logger.debug("Duplicate entry when retrieving history: keyname->" + p.getKeyName() + ", date->"
                        + p.getInsertionDate() + ", value->" + p.getContentValue());
            }
        }
    } catch (Exception e) {
        logger.error("Error during insert multiple data ",e);
        throw new PippoException(PippoException.CodeError.dbError, e.getMessage());
    }
}

Я хотел бы иметь несколько вставок, и, поскольку есть повторяющиеся записи, программа продолжает оставшиеся вставки. Теперь, к сожалению, при наличии дублирующейся записи у меня возникает исключение MySQLIntegrityConstraintViolationException во время выполненияи Hibernate останавливает выполнение внутри блока "for" и выполняет откат.

Я понятия не имею, как справиться с этим сценарием.Пожалуйста, какие-либо предложения?

Спасибо большое.

1 Ответ

0 голосов
/ 06 октября 2018

Если количество записей в таблице не так велико, вы можете извлечь все существующие записи как Set<> existingPippos и вставить результат new HashSet<Pippo>(pl).removeAll(existingPippos) вместо перехвата для дублирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...