основная вставка в спящем режиме - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь загрузить лист Excel в таблицу базы данных. Я конвертирую строки Excel в спящий объект и пытаюсь сохранить его в базе данных. чтобы достичь этого, я сталкиваюсь с проблемой. Есть несколько ограничений по БД, таких как уникальный или составной ключ и т. д., но пользователь может загрузить любой лист. поэтому, если не удалось вставить чередующийся ряд, то мое требование - продолжить следующий ряд. и транзакция должна быть сохранена.

`Session session=localSessionFactoryBean.getObject().openSession();
        Transaction tx = session.beginTransaction();
fot(i=0;i<list.size();i++){
Long Id = (Long) session.save(list.get(i));
if (i % 50 == 0) {
                    session.flush();
                    session.clear();
                }
}
tx.commit();
session.close();

` здесь, если одна строка не удалась, то все строки терпят неудачу. я получаю org.hibernate.AssertionFailure: исключение null id (не очищать сессию после возникновения исключения). Пожалуйста, помогите массовой загрузки.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Hibernate не позволяет сбрасывать сеанс после возникновения исключительной ситуации (вы должны увидеть сообщение don't flush the Session after an exception occurs в stacktrace), поэтому способ продолжить может быть таким:

Разделите ваш list на блоки по 50 элементов и попытайтесь сохранить каждый кусок в одной транзакции:

  • если все прошло хорошо, просто зафиксируйте и переходите к следующему фрагменту.
  • если произошла ошибка, откатите транзакцию и перезапустите чанк, НО сохраните каждый элемент неудачного чанка в выделенной транзакции
0 голосов
/ 28 августа 2018

Для этого вы должны использовать конструкцию try-catch, чтобы продолжить вставку записей, даже если некоторые из них завершатся неудачно:

Session session=localSessionFactoryBean.getObject().openSession();
Transaction tx = session.beginTransaction();
for(i=0;i<list.size();i++){
  try{
    Long Id = (Long) session.save(list.get(i));
  } catch(Exception e){
    //nop  
  }
  if (i % 50 == 0) {
     session.flush();
     session.clear();
     tx.commit();      
  }
}
tx.commit();
session.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...