3

次のスタックトレースで一度だけ再現されました

原因: org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes(AbstractFlushingEventListener.java:119) での java.lang.NullPointerException org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:65) で.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

nullpointer を生成するメソッドは次のとおりです (ソース: http://grepcode.com/file_/repo1.maven.org/maven2/org.hibernate/hibernate/3.2.6.ga/org/hibernate/event/def/AbstractFlushingEventListener .java/?v=ソース):

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 );
        }
    }
}

IdentityMap.concurrentEntriesは、提供されたマップのエントリを含む Map.Entry の配列を返します。からマップに null 要素が返されているsession.getPersistenceContext().getEntityEntries()ようです。ソース コードを取得して (ほとんどの IDE で可能です)、メソッドをデバッグしてください。また、エンティティの定義を確認してください。何か問題がある可能性があります..

于 2013-08-06T07:40:14.073 に答える