Проблема с LazyInitializationException - PullRequest
0 голосов
/ 10 ноября 2010

Я делаю приложение, используя Hibernate 3.6.0, и я получил исключение LazyInitializationException. Мне не удалось ее решить, поэтому я здесь и прошу вашей помощи.

Вот StackTrace:

Exception in thread "AWT-EventQueue-0" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: model.Transformator.poze, no session or session was closed
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
    at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
    at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:368)
    at org.hibernate.collection.PersistentSet.add(PersistentSet.java:212)
    at model.Transformator.addPoza(Transformator.java:93)
    at controller.WinController.uploadPoza(WinController.java:47)
    at view.Win$1UploadActionListener.actionPerformed(Win.java:138)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Заставка для объекта Transformator:

public void transformatorSaver(Transformator t)
    {
        Session session = SessionFactoryUtil.getInstance().getCurrentSession();
        Transaction tx = null;

        try
        {
            tx = session.beginTransaction();
            @SuppressWarnings("unused")
            Transformator tr = (Transformator) session.merge(t);
            tx.commit();
        }
        catch (Exception e)
        {
            tx.rollback();
        }
        finally
        {
            session.close();
        }
    }

Сущность Transformator имеет набор изображений (байтовый массив). Исключение начинается, когда я добавляю новое изображение в сущность Transformator и вызываю заставку для преобразователя.

Какое разрешение для этой проблемы? Спасибо

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Ваш объект-трансформатор содержит коллекцию, которая была ранее получена из спящего режима и загружена не полностью (отложенная загрузка).Когда вы сохраняете, вы запускаете каскадирование к этому объекту, и когда он затем пытается прочитать данные, которые не были загружены (из-за отложенной загрузки), вы получаете исключение.

Либо удалите каскадирование (если это то, что выхотите) или полностью загрузите объект, стремясь загрузить / явным образом вызвать получатель для этой коллекции, чтобы загрузить его, когда вы получите объект Transformator.

1 голос
/ 10 ноября 2010

Проблема в том, что для добавления изображения в преобразователь вы вызываете метод getPoze (), который заставляет hibernate пытаться получить коллекцию из базы данных.Очевидно, что это происходит без открытой транзакции, поэтому вам нужно начать транзакцию перед ее добавлением и закрыть ее после вызова saver.Примерно так:

public void addPoze(Transformator tr, Poze poze) {
          try
            {
                tx = session.beginTransaction();
                tr.getPoze().add(poze);
                @SuppressWarnings("unused")
                Transformator tr = (Transformator) session.merge(t);
                tx.commit();
            }
            catch (Exception e)
            {
                tx.rollback();
            }
            finally
            {
                session.close();
            }
}

или вы можете перейти к методу addPoze коллекции, которую вы хотите добавить, чтобы повысить производительность за счет сокращения операций открытия-открытия транзакций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...