Hibernate. AssertionFailure : null id entry
От: talkin США  
Дата: 01.03.08 16:06
Оценка:
Здравствуйте.


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. Или идентификатор не может получить, или его некорректно использует после попытки вставить дублированную строку (по полям с уникальными индексами).

Есть идеи?
There is a will, there is a way.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.