Справка по Hibernate Exception: TransientObjectException - PullRequest
6 голосов
/ 25 июня 2009

При попытке обновить объект я получаю следующее исключение:

org.hibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед сбросом: ......

Может кто-нибудь помочь ???

У объекта, который я пытаюсь обновить, атрибут 'lazy' установлен в false в файле отображения. Похоже, что hibernate ожидает от меня сохранения дочерних объектов до того, как оно сбросит обновление ???

РЕДАКТИРОВАТЬ (ДОБАВЛЕНО):

<hibernate-mapping>
    <class name="utils.message.Message" table="messages">
        <id name="id" column="message_id">
            <generator class="native" />
        </id>
        <property name="message_text" column="message_text" />
        <property name="message_file" column="message_file" />
        <property name="is_active" column="is_active" type="boolean"/>
        <property name="is_global" column="is_global" type="boolean"/>
        <property name="start" column="start" type="java.util.Date"/>
        <property name="end" column="end" type="java.util.Date"/>
        <property name="last_updated" column="last_updated" type="java.util.Date"/>     

        <many-to-one name="last_updated_by" class="utils.user.User" column="last_updated_by" lazy="false"/>
        <many-to-one name="healthDepartment" class="utils.healthdepartment.HealthDepartment" column="health_department_id" lazy="false"/>

    </class>
</hibernate-mapping>

Ответы [ 4 ]

17 голосов
/ 25 июня 2009

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

  1. Как вы предлагаете, вы можете использовать каскадирование сохранений для других связанных объектов. Однако каскадирование на самом деле не предназначалось для обхода ОО, а скорее для удобства сохранения группы связанных объектов, которые часто обрабатываются вместе. Если вы отсоедините свои объекты без полного набора связанных данных, а затем сохраните их с включенным каскадированием, вы можете случайно удалить данные, которые не хотите потерять.
  2. Убедитесь, что все временные объекты в вашем графике явно сохранены как часть вашей единицы работы. На самом деле это просто пример понимания того, как ваше приложение будет создавать граф объектов и какие объекты являются временными, а какие могут быть постоянными или отсоединенными.

Я бы порекомендовал прочитать всю эту главу из документов Hibernate, чтобы полностью понять терминологию переходных, постоянных и обособленных:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html

4 голосов
/ 19 октября 2010

чувак использует свойство "cascade = true" в отображении. все будет хорошо ... V-Boy

0 голосов
/ 01 июля 2009

Приложение находится в среде Spring. Исправлено: запускать обновления из среды Hibernate.

0 голосов
/ 26 июня 2009

С отношением «многие к одному» для Hibernate было бы неуместно каскадировать операции персистентности, поскольку концептуально «один» является сущностью, разделяемой между многими другими. Этот тип отношений, как вы выразились, не является «дочерним объектом».

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

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