0

我正在尝试 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。为什么抛出异常?

4

1 回答 1

1

从堆栈跟踪中,您正在使用 Cayenne v. 3.1。有问题的代码在这里。Cayenne SQLTemplateAction 检查查询结果是否为 ResultSet,如果答案为“否”,则假定结果为更新计数。因此它尝试读取第 190 行的更新计数:

 int updateCount = statement.getUpdateCount();

不知何故,底层语句对象 (LinterStatementImpl) 对此并不满意。我无权访问 Linter DB 驱动程序的源代码,所以我不能说到底出了什么问题,但驱动程序的行为并不像 Cayenne 期望的那样。

也许 Linter 足够特别,足以保证它自己的 Cayenne DbAdapter (??) 随时加入 Cayenne 开发邮件列表,讨论编写一个 DbAdapter 需要什么。

于 2015-08-05T09:56:11.827 回答