【发布时间】:2011-04-10 12:07:38
【问题描述】:
在 Grails 中使用遗留代码库。在某些情况下(我们不清楚具体是什么),我们会得到一个神秘的 NPE,堆栈跟踪如下,同时执行 findBy。
到目前为止,我们有点受阻;这出现在 Hibernate 的几个论坛中,但响应似乎归结为“您的架构有问题”。如果能找到一些额外的细节来帮助我们追踪问题,那就太好了。
更新
感谢您的回答。是的,很明显,在这个 NPE 发生时,version 是 null。麻烦的是,当我们在代码中查看时,它不是 null。
我们开始怀疑存在线程问题。
Caused by: java.lang.NullPointerException
at org.hibernate.type.LongType.next(LongType.java:79)
at org.hibernate.engine.Versioning.increment(Versioning.java:131)
at org.hibernate.event.def.DefaultFlushEntityEventListener.getNextVersion(DefaultFlushEntityEventListener.java:387)
at org.hibernate.event.def.DefaultFlushEntityEventListener.scheduleUpdate(DefaultFlushEntityEventListener.java:279)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:151)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:49)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
at org.codehaus.groovy.grails.plugins.quartz.listeners.SessionBinderJobListener.jobWasExecuted(SessionBinderJobListener.java:58)
at org.quartz.core.QuartzScheduler.notifyJobListenersWasExecuted(QuartzScheduler.java:1910)
【问题讨论】:
-
当然,我不知道所有的细节,但是......线程问题怎么能抵消一些东西?完全排除具有空版本列的记录?
-
哦,不,正好相反:很明显,此时版本列 为 为空。很难弄清楚 why 因为在周围的代码中它似乎不是。不过,我们对线程问题有一些确认,因为我们将其强制为单线程并停止获取 NPE。仍然不明白根本原因,'tho.