gpt4 book ai didi

hibernate - Grails/hibernate : Null Pointer Exception on versioning

转载 作者:行者123 更新时间:2023-12-03 06:36:18 28 4
gpt4 key购买 nike

使用 Grails 中的遗留代码库。在某些情况下(我们不清楚具体是什么),我们在执行 findBy 时会得到一个神秘的 NPE,堆栈跟踪如下。

到目前为止,我们有点受阻;这出现在 Hibernate 的多个论坛中,但响应似乎归结为“您的架构有问题”。如果能找到一些额外的细节来帮助我们追踪问题,那就太好了。

更新

谢谢你的回答。是的,很明显,在发生此 NPE 时,versionnull。问题是,当我们在代码中查看它时,它不是 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)

最佳答案

这是我对跟踪的理解:

  • 你或其他人做了 findBy
  • 这个triggers一个flush
  • session 包含一个脏对象,其版本字段(类型为 Long )需要更新
  • Hibernate 尝试获取更新的版本字段的下一个值
  • 这就是您获得 NPE 的地方

org.hibernate.engine.Versioning.increment(Versioning.java:131)的正文是:

public static Object increment(Object version, VersionType versionType, SessionImplementor session) {
Object next = versionType.next( version, session ); // line 131
if ( log.isTraceEnabled() ) {
log.trace(
"Incrementing: " +
versionType.toLoggableString( version, session.getFactory() ) +
" to " +
versionType.toLoggableString( next, session.getFactory() )
);
}
return next;
}

还有org.hibernate.type.LongType.next(LongType.java:79)的正文(它提供了上述 versionType.next 的实现):

public Object next(Object current, SessionImplementor session) {
return new Long( ( (Long) current ).longValue() + 1 ); // line 79
}

很明显 version传递至incrementnull

因此,我会在数据库中查找带有 NULL 的记录。其版本列中的值。激活 SQL 日志记录可能有助于缩小搜索范围。

关于hibernate - Grails/hibernate : Null Pointer Exception on versioning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3680951/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com