3

它仅通过以下堆栈跟踪复制了一次

原因:org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65) 的 org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65) 的 java.lang.NullPointerException。 .event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:35) 在 org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:970) 在 org.hibernate.impl.SessionImpl.list(SessionImpl.java:1115) 在org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)

任何人都知道可能是什么原因?

休眠版本是 3.2.7.GA

我确信原因不在当前查询中,因为每个列表都执行。为什么当前会话的刷新会下降?是否可以以某种方式预防?

4

1 回答 1

1

这是产生空指针的方法(来源:http ://grepcode.com/file_/repo1.maven.org/maven2/org.hibernate/hibernate/3.2.6.ga/org/hibernate/event/def/AbstractFlushingEventListener .java/?v=source ):

private void prepareEntityFlushes(EventSource session) throws HibernateException {

    log.debug("processing flush-time cascades");

    final Map.Entry[] list = IdentityMap.concurrentEntries( session.getPersistenceContext().getEntityEntries() );
    //safe from concurrent modification because of how entryList() is implemented on IdentityMap
    final int size = list.length;
    final Object anything = getAnything();
    for ( int i=0; i<size; i++ ) {
        Map.Entry me = list[i];
        EntityEntry entry = (EntityEntry) me.getValue(); //nullpointer here!
        Status status = entry.getStatus();
        if ( status == Status.MANAGED || status == Status.SAVING ) {
            cascadeOnFlush( session, entry.getPersister(), me.getKey(), anything );
        }
    }
}

返回一个 Map.Entry 数组,其中IdentityMap.concurrentEntries包含所提供地图的条目。看起来在 map 中返回了一个 null 元素session.getPersistenceContext().getEntityEntries(),尝试获取源代码(应该可以通过大多数 IDE 进行)并调试该方法。另外,仔细检查您的实体定义,那里可能有问题..

于 2013-08-06T07:40:14.073 回答