hibernate: LazyInitializationException: не удалось инициализировать прокси - PullRequest
69 голосов
/ 06 декабря 2008

Вот тот, который меня озадачил. Я пытаюсь реализовать базовую структуру DAO Hibernate, но у меня возникла проблема.

Вот необходимый код:

int startingCount = sfdao.count();
sfdao.create( sf );
SecurityFiling sf2 = sfdao.read( sf.getId() );
sfdao.delete( sf );
int endingCount = sfdao.count();

assertTrue( startingCount == endingCount );
assertTrue( sf.getId().longValue() == sf2.getId().longValue() );
assertTrue( sf.getSfSubmissionType().equals( sf2.getSfSubmissionType() ) );
assertTrue( sf.getSfTransactionNumber().equals( sf2.getSfTransactionNumber() ) );

Ошибка на третьем assertTrue, где он пытается сравнить значение в sf с соответствующим значением в sf2. Вот исключение:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:86)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:140)
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
    at com.freightgate.domain.SecurityFiling_$$_javassist_7.getSfSubmissionType(SecurityFiling_$$_javassist_7.java)
    at com.freightgate.dao.SecurityFilingTest.test(SecurityFilingTest.java:73)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:40)

Ответы [ 14 ]

1 голос
/ 03 августа 2011

используйте Hibernate.initialize для ленивых полей

1 голос
/ 26 июля 2010

Я думаю, что Пико в своем ответе говорит, что есть файл hbm. У меня есть файл под названием Tax.java. Информация о сопоставлении сохраняется в файле hbm (= отображение hibernate). В теге class есть свойство с именем lazy . Установите для этого свойства значение true. В следующем примере hbm показан способ установить для свойства lazy значение false .

` Я бы ...

Если вы используете аннотации, посмотрите документацию гибернации. http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/

Надеюсь, это помогло.

1 голос
/ 09 декабря 2008

Если вы управляете сеансом Hibernate вручную, вы можете посмотреть на sessionFactory.getCurrentSession () и соответствующие документы здесь:

http://www.hibernate.org/hib_docs/v3/reference/en/html/architecture-current-session.html

0 голосов
/ 12 марта 2015

По умолчанию все ассоциации one-to-many и many-to-many выбираются лениво при первом доступе.

В вашем случае использования вы могли бы преодолеть эту проблему, обернув все операции DAO в одну логическую транзакцию:

transactionTemplate.execute(new TransactionCallback<Void>() {
    @Override
    public Void doInTransaction(TransactionStatus transactionStatus) {

        int startingCount = sfdao.count();

        sfdao.create( sf );

        SecurityFiling sf2 = sfdao.read( sf.getId() );

        sfdao.delete( sf );

        int endingCount = sfdao.count();

        assertTrue( startingCount == endingCount );
        assertTrue( sf.getId().longValue() == sf2.getId().longValue() );
        assertTrue( sf.getSfSubmissionType().equals( sf2.getSfSubmissionType() ) );
        assertTrue( sf.getSfTransactionNumber().equals( sf2.getSfTransactionNumber() ) );

        return null;
    }
});

Другой вариант - получить все ассоциации LAZY при загрузке вашей сущности, так что:

SecurityFiling sf2 = sfdao.read( sf.getId() );

должен получить LAZY submissionType тоже:

select sf
from SecurityFiling sf
left join fetch.sf.submissionType

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

Вы можете получить столько [one|many]-to-one ассоциаций и одну "[one | many]-to-many" ассоциацию списка (из-за запуска декартового произведения).

Чтобы инициализировать несколько «[один | много]-ко-многим», вы должны использовать Hibernate.initialize (collection) , сразу после загрузки вашей корневой сущности.

...