Apache Cayenne: исключение NullPointerException при фиксации изменений

Я пытаюсь совершить commitChanges, но ловлю java.lang.NullPointerException. журнал:

...  
INFO: --- transaction started.
авг 04, 2015 12:33:59 PM org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy processSchemaUpdate
INFO: Full or partial schema detected, skipping tables creation
авг 04, 2015 12:33:59 PM org.apache.cayenne.log.CommonsJdbcEventLogger logQuery
INFO: SELECT NEXT_ID FROM AUTO_PK_SUPPORT WHERE TABLE_NAME = 'ARTIST'
авг 04, 2015 12:33:59 PM org.apache.cayenne.log.CommonsJdbcEventLogger logSelectCount
INFO: === returned 1 row. - took 16 ms.
авг 04, 2015 12:33:59 PM org.apache.cayenne.log.CommonsJdbcEventLogger logQueryError
INFO: *** error.
java.lang.NullPointerException
    at com.relx.jdbc.jdbc2.LinterStatementImpl.getUpdateCount(LinterStatementImpl.java:419)
    at org.apache.cayenne.access.jdbc.SQLTemplateAction.execute(SQLTemplateAction.java:190)
    at org.apache.cayenne.access.jdbc.SQLTemplateAction.performAction(SQLTemplateAction.java:124)
    at org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
    at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
    at org.apache.cayenne.dba.JdbcPkGenerator.longPkFromDatabase(JdbcPkGenerator.java:310)
    at org.apache.cayenne.dba.JdbcPkGenerator.generatePk(JdbcPkGenerator.java:268)
    at org.apache.cayenne.access.DataDomainInsertBucket.createPermIds(DataDomainInsertBucket.java:171)
    at org.apache.cayenne.access.DataDomainInsertBucket.appendQueriesInternal(DataDomainInsertBucket.java:76)
    at org.apache.cayenne.access.DataDomainSyncBucket.appendQueries(DataDomainSyncBucket.java:78)
    at org.apache.cayenne.access.DataDomainFlushAction.preprocess(DataDomainFlushAction.java:188)
    at org.apache.cayenne.access.DataDomainFlushAction.flush(DataDomainFlushAction.java:144)
    at org.apache.cayenne.access.DataDomain.onSyncFlush(DataDomain.java:853)
    at org.apache.cayenne.access.DataDomain$2.transform(DataDomain.java:817)
    at org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
    at org.apache.cayenne.access.DataDomain.onSyncNoFilters(DataDomain.java:814)
    at org.apache.cayenne.access.DataDomain$DataDomainSyncFilterChain.onSync(DataDomain.java:1031)
    at org.apache.cayenne.access.DataDomain.onSync(DataDomain.java:785)
    at org.apache.cayenne.access.DataContext.flushToParent(DataContext.java:817)
    at org.apache.cayenne.access.DataContext.commitChanges(DataContext.java:756)
    at CayenneTest2.main(CayenneTest2.java:61)

Таблица AUTO_PK_SUPPORT была создана и заполнена Apache Cayenne. Зачем бросать исключение?


person sergpc    schedule 04.08.2015    source источник


Ответы (1)


Судя по трассировке стека, вы работаете с Cayenne v. 3.1. Рассматриваемый код: здесь. Cayenne SQLTemplateAction проверяет, является ли результат запроса набором результатов, и при ответе «нет» предполагает, что результатом является количество обновлений. Поэтому он пытается прочитать количество обновлений в строке 190:

 int updateCount = statement.getUpdateCount();

Почему-то базовый объект оператора (LinterStatementImpl) этому не рад. У меня нет доступа к исходному коду драйвера БД ЛИНТЕР, поэтому я не могу сказать, что именно не так, но драйвер ведет себя не так, как ожидает Cayenne.

Возможно, Линтер достаточно уникален, чтобы гарантировать наличие собственного Cayenne DbAdapter (??). Не стесняйтесь присоединиться к списку рассылки Cayenne dev, чтобы обсудить, что нужно для его написания.

person andrus_a    schedule 05.08.2015
comment
Вероятно, это ошибка драйвера Линтера. Благодарить. - person sergpc; 07.08.2015