我有点奇怪的问题。这是带有DB2400Dialect的Hibernate 3.3.2-GA。我看到以下异常 -
java.lang.NullPointerException
at org.hibernate.loader.Loader.doQuery(Loader.java:720)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2232)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
at org.hibernate.loader.Loader.list(Loader.java:2124)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:312)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1723)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175)
at com.example.WidgetDao.getAllWidgets(WidgetDao.java:28)
at com.example.TestWidgetDao.testGetAllWidgets(TestWidgetDao.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:618)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
testGetAllWidgets()方法连续两次调用WidgetDao.getAllWidgets()。第一个电话完全正常。返回的结果集和映射对象完全符合我的预期。但是,我再次立即调用getAllWidgets()并抛出上面的NPE。我已经将它跟踪得更深了,Loader.java中的以下行返回一个空结果集 -
// Line 1809 in
rs = session.getBatcher().getResultSet( (CallableStatement) st, dialect );
DAO方法执行映射文档中定义的存储过程。
我真的很难过。我已经将几十个类映射到不同的存储过程。突然,这个人决定给我配合。 proc没有什么特别之处,它只返回一些String列。
任何人都知道如何进一步追踪这一点?
谢谢!
答案 0 :(得分:2)
这更可能不是DB2 JDBC驱动程序的问题。
在DB2Dialect.getResultSet()
方法中放置一个断点,然后检查ResultSet
你到达那里。也许它试图变得聪明并缓存CallableStatement
并且出现问题。
当你说“立即再打电话”时,你的意思是“立即” - 例如在同一个会话中?它是否适用于新的会话(它应该)?如果您没有找到JDBC级解决方案(某些连接参数可以关闭缓存),那么这可能是另一种解决方案。