Является ли lazy = "false" единственным решением для "org.hibernate.LazyInitializationException: не удалось инициализировать прокси - нет сеанса" - PullRequest
0 голосов
/ 24 мая 2011

«org.hibernate.LazyInitializationException: не удалось инициализировать прокси - нет сеанса« доставляло мне много боли. Некоторые из старых потоков stackoverflow обсуждают эту конкретную проблему. Я следовал за ними и решил проблему.

В xmlnate mapping xml я добавил lazy="false" к тегам классов и коллекциям тегов, таким как set и list.

<class name="User" table="users" lazy="false">
    <id name="id" column="id">
        <generator class="native"/>
    </id>        
    <property name="type" column="type"/>         
    <many-to-one name="parent" column="parent"/>
    <property name="loginName" column="login_name" unique="true" not-null="true" index="idx_users_login_name" length="50"/>
    <property name="name" column="name" length="50"/>
    <property name="password" column="password"/>
    <property name="email" column="email" length="50"/>
    <property name="locale" column="locale" length="20"/>
    <property name="locked" column="locked"/>
    <many-to-one name="metadata" column="metadata_id"/>
    <set name="userSpaceRoles" cascade="all" inverse="true" lazy="false">
        <key column="user_id"/>
        <one-to-many class="UserSpaceRole"/>
    </set>      
</class>

<class name="UserSpaceRole" table="user_space_roles" lazy="false">
    <id name="id" column="id">
        <generator class="native"/>
    </id>
    <many-to-one name="user" column="user_id"/>
    <many-to-one name="space" column="space_id"/>
    <property name="roleKey" column="role_key" not-null="true"/>
</class>   

Таким образом, проблема была решена.

  • Является ли lazy="flase" единственным решением?
  • Что случилось, если я установил lazy="false"?
  • Должен ли я указать lazy="false" в теге класса?

Для получения дополнительной информации я использую JBoss 4.2.0.GA и сталкиваюсь с этой проблемой при каждой перезагрузке сервера.

1 Ответ

1 голос
/ 24 мая 2011

Вместо использования lazy="false" для элемента класса лучше использовать его в коллекциях.То есть, например, всякий раз, когда вы выбираете объект User, так как коллекция в UserSpaceRole помечается как не ленивая, коллекция также будет извлечена.Элемент имеет некоторые нежелательные последствия.Как правило, когда коллекция не ленивая, как я уже говорил выше, вся коллекция извлекается с использованием join, select или subselect, в зависимости от вашей стратегии извлечения.Например, в стратегии выбора при извлечении User из базы данных hibernate выдает два оператора выбора: один для самого пользователя и один для коллекции.Однако hibernate может выбрать прокси отдельных элементов внутри коллекции.
С lazy="false" hibernate не может проксировать эти объекты и обычно прибегает к использованию одного запроса с объединением двух таблиц.Это не всегда может быть желательным.

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

...