Ошибка нарушения первичного ключа HSQLDB в тестах JUnit

У нас есть среда тестирования, использующая JUnit, OpenEJB, Eclipselink и HSQLDB. До сих пор все работало нормально, и тестирование уровня службы -не составило труда. Однако теперь мы сталкиваемся с проблемами при массовом импорте таблицы (с использованием уровня службы -, менеджера сущностей )или, например, многократного сохранения сущностей в списке в методе службы.

ЭТО СТРАННАЯ ЧАСТЬ :Похоже, что наши тесты ломаются только в том случае, если тесты запускаются на достаточно быстрой рабочей станции из командной строки с помощью Maven. Когда я запускаю тесты через Eclipse IDE, все нормально, но иногда случайным образом тоже происходит сбой. Мы подозреваем, что это может быть как-то связано со скоростью, с которой выполняются тесты.как ни странно это звучит. Исключение достаточно простое, потому что оно говорит нам, что мы пытаемся добавить объект с уже существующим идентификатором. Мы несколько раз проверили наши тестовые данные и базу данных hsqldb. Нет предварительно -существующих строк с идентификаторами, которые мы пытаемся использовать. Тем не менее, hsqldb в какой-то момент выдает исключение первичного ключа. Из наших логов мы видим, что конфликтующий идентификатор не всегда один и тот же, это может быть 300015 или 300008.

Здесь мы в замешательстве. Может ли это быть связано с транзакциями HSQLDB или с чем-то еще, вызывающим устаревшие данные?

Мы используем HSQLDB 2.2.8, Eclipselink 2.3.0 и OpenEJB 4.0.0 -beta2.

Отношение, в которое мы пытаемся добавить объекты, отображается следующим образом.:

@OneToMany(mappedBy = "invoice", cascade = CascadeType.PERSIST)
private List<InvoiceBalance> getInvoiceBalanceHistory() {
    if (invoiceBalanceHistory == null) {
        this.invoiceBalanceHistory = new ArrayList<InvoiceBalance>();
    }
    return invoiceBalanceHistory;
}

Корневое исключение::

Caused by: java.sql.SQLIntegrityConstraintViolationException: integrity constraint violation: unique constraint or index violation; SYS_PK_10492 table: INVOICEBALANCE
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:831)
... 82 more
Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or   index violation; SYS_PK_10492 table: INVOICEBALANCE
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.Constraint.getException(Unknown Source)
at org.hsqldb.index.IndexAVLMemory.insert(Unknown Source)
at org.hsqldb.persist.RowStoreAVL.indexRow(Unknown Source)
at org.hsqldb.TransactionManager2PL.addInsertAction(Unknown Source)
at org.hsqldb.Session.addInsertAction(Unknown Source)
at org.hsqldb.Table.insertSingleRow(Unknown Source)
at org.hsqldb.StatementDML.insertSingleRow(Unknown Source)
at org.hsqldb.StatementInsert.getResult(Unknown Source)
at org.hsqldb.StatementDMQL.execute(Unknown Source)
at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)

РЕДАКТИРОВАТЬ:

Я изменил стратегию генерации первичного ключа с GenerationType.AUTO (, которая, похоже, использует TABLE -стратегия по умолчанию )на IDENTITY. После этого наша масса продолжает работать безотказно. Я до сих пор не знаю, почему HSQLDB «рассинхронизируется» со стратегией TABLE -. Я бы не хотел менять наши объекты jpa только потому, что наша среда тестирования содержит ошибки:)

6
задан Antti Kolehmainen 25 April 2012 в 07:00
поделиться