2009-06-25 82 views
6

我收到以下异常,当我尝试更新的对象:休眠例外帮助:TransientObjectException

org.hibernate.TransientObjectException:对象引用一个未保存的瞬态的实例 - 冲洗之前保存的瞬态的实例:.... ..

任何人都可以帮助?

我试图更新的对象在映射文件中将'lazy'属性设置为false。看起来像hibernate期待我在保存子对象刷新更新之前?

EDIT(添加):当保存的对象,其引用另一个对象,它是瞬时发生

<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> 
+0

好像使用级联属性在映射文件可以解决我的问题?只是不确定哪种风格适合我。 (尽管我认为只用delete-orphan就是我需要的)。 从新手角度理解hibernate文档可能有点困难。 – Rafael 2009-06-25 16:58:15

+0

你可以发布hibhernate映射文件或注释的相关部分吗? – skaffman 2009-06-25 17:46:40

回答

0

应用程序处于Spring环境。修复:从Hibernate环境中运行更新。

15

TransientObjectException(这意味着它具有的“默认”标识符值,经常空),然后冲洗会话。这通常发生在您创建新对象的整个图形但未明确保存所有对象时。有两种方法可以解决此问题:

  1. 正如您所建议的,您可以使用级联保存到其他关联对象。但是,级联并非真正用作TOE的解决方法,而是为了方便保存一组经常一起操作的相关对象。如果您在没有完整关联数据集的情况下分离对象,然后通过级联启用进行保存,则可能会无意中删除不想丢失的数据。
  2. 确保图形中的所有瞬态对象都明确保存为工作单元的一部分。这实际上只是理解应用程序如何创建对象图以及哪些实体是暂时的,哪些可能是持久的或分离的情况。

我会建议你阅读从Hibernate文档这整个章节,充分了解短暂的,持续性的术语和分离:

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

+1

上述网址已损坏;这里是新的@ http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate。html – ManuPK 2012-03-04 04:46:01

0

随着一个多到一的关系,也不会适合Hibernate级联持久化操作,因为“one”在概念上是许多其他人共享的实体。就像你说的那样,这种关系不是一个“小孩对象”。

您可以通过在关系上显式设置级联属性来覆盖此行为,也可以手动保留多对一关系的另一端。

+0

Skaffman, 感谢您的澄清。我刚刚阅读了brd6644建议的文档。它有助于更​​好地理解Hibernate的一些基本概念。 最终,我需要一些帮助搞清楚如何能够更新消息,而不会将操作级联到与消息关联的用户/ HD。 – Rafael 2009-06-26 12:53:39

3

老兄使用属性“级联=真”在映射。一切都会好... V-男孩