加载程序类中的Hibernate NullPointerException

加载程序类中的Hibernate NullPointerException,hibernate,db2,Hibernate,Db2,我有点奇怪的问题。这是Hibernate3.3.2-GA和db2400方言。我看到以下例外情况-- testGetAllWidgets()方法连续两次调用WidgetDao.getAllWidgets()。第一次通话效果很好。返回的结果集和映射对象与我期望的完全一样。但是,我再次立即调用getAllWidgets(),并抛出上面的NPE。我对它进行了更深入的跟踪,Loader.java中的下面一行返回了一个空结果集-- DAO方法由映射文档中定义的存储过程执行 我真的被难住了。我已经将几十个类映

我有点奇怪的问题。这是Hibernate3.3.2-GA和db2400方言。我看到以下例外情况--

testGetAllWidgets()方法连续两次调用WidgetDao.getAllWidgets()。第一次通话效果很好。返回的结果集和映射对象与我期望的完全一样。但是,我再次立即调用getAllWidgets(),并抛出上面的NPE。我对它进行了更深入的跟踪,Loader.java中的下面一行返回了一个空结果集--

DAO方法由映射文档中定义的存储过程执行

我真的被难住了。我已经将几十个类映射到不同的存储过程。突然,这一个决定给我适合。proc没有什么特别之处,它只返回几个字符串列

有人知道如何进一步追查吗


谢谢

这很可能不是DB2JDBC驱动程序的问题

DB2Dialect.getResultSet()
方法中放置一个断点,然后检查所得到的
ResultSet
。也许它试图聪明地缓存
CallableStatement
,结果出了问题


当你说“立即再次呼叫”时,你真的是指“立即”-例如,在同一个会话中?它在新的会话中是否有效(应该)?如果您没有找到JDBC级别的解决方案(使用一些连接参数来关闭缓存),那么这可能是另一种解决方案

谢谢。我会深入研究的。立即就是立即!!这是确切的密码。我也尝试了不同的课程,但仍然以完全相同的方式失败@Test public void testGetAllWidgets(){//ThreadLocal sessions sessions s=SessionFactory.currentSession();WidgetDao=new WidgetDao;List widgets=dao.getAllWidgets();//Works widgets=dao.getAllWidgets();//Vomits SessionFactory.closeSession();}我已经按照建议做了,并在Db2Dialect.getResultSet()中加了一个中断。果然,第一次是通过ResultSet rs=ps.getResultSet();返回一个有效集。第二次返回null。您是否使用具有多个连接的数据库池?如果是这样,并且在不同的会话中失败,那么这一定是JDBC中的一个错误(我认为callable语句不能跨连接缓存)。您使用的是最新和最好的jdbc版本吗?有关于它的bug报告吗?JDBC bug或Hibernate。我正在使用最新的JTOPEN驱动程序和Hibernate 3.3.2-GA。我可以尝试Hibernate的开发版本。我正在使用池,但为了简化问题,我已经去掉了池。它还在那里。如果池在内部或外部,则没有区别。我提到池的原因是,在同一个连接上执行此操作与在不同的连接上执行此操作之间存在潜在的区别(显然,在您的情况下两者都不起作用,所以请忽略这一点)。无论如何,这绝对不是一个Hibernate核心bug。要么是JDBC问题(很可能),要么是
Db2Dialect
处理
CallableStatement
的方式不适用于这个特定的JDBC驱动程序。您是否尝试过在直接的JDBC中这样做?把一个测试用例放在一起应该是相当琐碎的。如果仍然失败,请向JTOpen提交一个bug。
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)
// Line 1809 in     
rs = session.getBatcher().getResultSet( (CallableStatement) st, dialect );