2013-08-06 4 views
2

Он был воспроизведен только один раз со следующими StackTraceСпящий NullPointerException в Query.list()

Вызванный: java.lang.NullPointerException на org.hibernate.event.def.AbstractFlushingEventListener.prepareEntityFlushes (AbstractFlushingEventListener.java : 119) на org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions (AbstractFlushingEventListener.java:65) на org.hibernate.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)

Каждый имеет представление, что может быть причиной?

Hibernate версия 3.2.7.GA

Я уверен, что причина не в текущем запросе, для каждого списка выполнить. Почему можно сбросить текущую сессию? Можно ли это как-то предотвратить?

+6

Исходный код отсутствует – sanbhat

+3

Мне не удалось взломать ваш компьютер и удаленно получить код, на который вы ссылались. Можешь дать мне руку? –

+1

Классы, упомянутые в stacktrace, являются внутренними элементами Hibernate, поэтому для этого вам нужно будет взломать машину anyones, которая находится за пределами меня. Какая версия Hibernate будет использована, было бы хорошо знать, хотя .. – Tobb

ответ

1

Вот метод, который производит NullPointer (источник: 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); 
     } 
    } 
} 

IdentityMap.concurrentEntries возвращает массив Map.Entry с записями поставляемой карты. Похоже, что на карте возвращается нулевой элемент от session.getPersistenceContext().getEntityEntries(), попробуйте получить исходный код (должен быть возможен через большинство IDE) и отладить метод. Кроме того, пройдите через определения сущности, может быть, что-то не так.

+0

Возможно, что-то связано с полями его классов , Посмотрите на [это] (http://stackoverflow.com/q/8578257/1199132). –

+0

Действительно с Maven, чтобы взглянуть на источники ;-) Кстати, ссылка, предоставленная Tobb, - это одна из следующих версий, одна из которых вам нужна для источников [this] (http://grepcode.com/file_/repo1. maven.org/maven2/org.hibernate/hibernate/3.2.7.ga/org/hibernate/event/def/AbstractFlushingEventListener.java/?v=source). Не думайте, что это должно быть релевантно. –

+0

Спасибо, проблема в этой строке EntityEntry entry = (EntityEntry) me.getValue(); Но отладка не помогает в этой ситуации, поскольку исключение было только один раз, и я пытаюсь воспроизвести эту проблему много времени после, но все было в порядке. – Amigo

Смежные вопросы