Проблема с Hibernate.initialize (...) Я получил LazyInitializationException, но когда я отлаживаю все нормально - PullRequest
0 голосов
/ 20 сентября 2018

Я загружаю 2,5 миллиона сложных объектов в MS SQL.Из-за производительности я использую вид кеша в памяти.Во время этого процесса я вызываю Hibernate.initialize(...) Использование настроек JVM по умолчанию не всегда выполняется в одном и том же месте (каждый раз при сбое одной и той же записи).

У меня три Set<>, и я три раза звоню Hibernate.initialize(...) ( секция A ) Всегда секунда Set<> не инициализируется должным образом.

  • Когда я устанавливаю точку останова перед инициализацией и прохожу код, тогда все в порядке (проблем не возникало / исключений не возникало)
  • Когда я устанавливаю точку останова после LazyInitializationException, проблема всегда возникает.
  • Когда я проверяю id записи и вызываю toString() после инициализации, тогда все в порядке (проблем не было /исключений не происходит) - раздел B

код выглядит следующим образом:

 private SomeObject getObject(int id) {
     SomeObject result = null;
     if(!cache.containsKey(id)) {
         SomeObject obj = context.getEntity(SomeObject.class, new ContextKey(id));

         // section A
         Hibernate.initialize(((SomeParentObject)obj.getField()).getSetA());
         Hibernate.initialize(((SomeParentObject)obj.getField()).getSetB());
         Hibernate.initialize(((SomeParentObject)obj.getField()).getSetC());

         // section B
         if(id == 1234) {
             ((SomeParentObject)obj.getField()).getSetB().toString();
         }

         cache.put(id, obj);
         result = obj;
     } else {
         result = cache.get(id);
     }
     return result;
 }

LazyInitializationException произошло после использования этого метода.

  1. Есть идеи, почему так может быть?
  2. Как отладить такого рода проблемы?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Я нашел обходной путь (чтобы избежать изменения конфигурации гибернации и т. Д.) - когда я использую:

    ((SomeParentObject)obj.getField()).getSetA().size();
    ((SomeParentObject)obj.getField()).getSetB().size();
    ((SomeParentObject)obj.getField()).getSetC().size();

вместо Hibernate.initialize(...), тогда он работаетхорошо.

0 голосов
/ 20 сентября 2018

У вас может быть Set <> с типом извлечения как Lazy, и когда вы его вызываете, они могут не входить в одну и ту же транзакцию.

Следовательно, это вызывает проблему, но она будет работать нормально при отладке.Попробуйте установить тип выборки как EAGER.

...