Здравствуйте.
public void parse(final int processNumber, final int commitNumber) {
hibernateSessionFactory.getCurrentSession().beginTransaction();
for (int i = 0; i < processNumber; i++) {
try {
TableRow tableRaw = new TableRow();
// заполняю данными
...
hibernateSessionFactory.getCurrentSession().save(tableRow);
if (i >= commitNumber) {
hibernateSessionFactory.getCurrentSession().getTransaction().commit();
hibernateSessionFactory.getCurrentSession().beginTransaction();
}
} catch (ConstraintViolationException e) {
// дублирование данных. Пишу в лог
} catch (HibernateException e) {
// обрабатываю
}
}
hibernateSessionFactory.getCurrentSession().getTransaction().commit();
}
Вот есть приблизительно такой код, таблица ассоциированная с TableRow имеет первичный ключ id, генератор в hibernate-mapping для него identity. Также для таблицы есть несколько уникальных индексов. На первой непродубдлированной строке после нескольких(1 и более) дублированных строк, вылетает исключение AssertionFailure с сообщением null id entry (don't flush after exception occurs). И вылетает до тех пор пока транзакцию не откатить и не начать новую. Но при этом, соответственно, теряются нормальные строки после последнего коммита до первой дублированной строки, чего естественно не хочется. Но и тратить на каждый инсерт по транзакции тоже не хочется. Пробовал использовать другие генераторы (sequence и assigned). В этих случаях говорит couldn't synchronize database state. Или идентификатор не может получить, или его некорректно использует после попытки вставить дублированную строку (по полям с уникальными индексами).
Есть идеи?
Здравствуйте, talkin, Вы писали:
[/java]
Извиняюсь, в коде косяк, надо так
public void parse(final int processNumber, final int commitNumber) {
hibernateSessionFactory.getCurrentSession().beginTransaction();
int insertCounter = 0;
for (int i = 0; i < processNumber; i++) {
try {
TableRow tableRaw = new TableRow();
// заполняю данными
...
hibernateSessionFactory.getCurrentSession().save(tableRow);
if (++insertCounter >= commitNumber) {
hibernateSessionFactory.getCurrentSession().getTransaction().commit();
hibernateSessionFactory.getCurrentSession().beginTransaction();
insertCounter = 0;
}
} catch (ConstraintViolationException e) {
// дублирование данных. Пишу в лог
} catch (HibernateException e) {
// обрабатываю
}
}
hibernateSessionFactory.getCurrentSession().getTransaction().commit();
}