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.
Re: Hibernate. AssertionFailure : null id entry
От: AO Россия  
Дата: 02.03.08 06:48
Оценка:
T>Есть идеи?

перенести проверку на дублирование в приложение... создать HashSet из id базы и перед вставкой проверять...
Re[2]: Hibernate. AssertionFailure : null id entry
От: talkin США  
Дата: 02.03.08 08:03
Оценка:
Здравствуйте, AO, Вы писали:

AO>перенести проверку на дублирование в приложение... создать HashSet из id базы и перед вставкой проверять...


id автоматически генерируется при вставке... Так что его выносить не вижу смысла. Имхо, нечто подобное очень накладно получится
There is a will, there is a way.
Re: Hibernate. AssertionFailure : null id entry
От: talkin США  
Дата: 02.03.08 09:28
Оценка:
Здравствуйте, 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();
}
There is a will, there is a way.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.