【问题标题】:Hibernate Exception help: TransientObjectException休眠异常帮助:TransientObjectException
【发布时间】:2009-06-25 16:33:27
【问题描述】:

当我尝试更新对象时出现以下异常:

org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例:......

谁能帮忙???

我尝试更新的对象在映射文件中将“lazy”属性设置为 false。似乎休眠希望我在刷新更新之前保存子对象???

编辑(添加):

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

【问题讨论】:

  • 似乎在映射文件中使用级联属性可以解决我的问题??只是不确定哪种风格适合我。 (虽然我认为只使用 delete-orphan 将是我需要的)。从新手的角度理解 hibernate 文档可能有点困难。
  • 你能发布你的hibhernate映射文件或注释的相关部分吗?

标签: java hibernate


【解决方案1】:

当您保存一个引用另一个瞬态对象的对象(意味着它具有“默认”标识符值,通常为空)然后刷新会话时,会发生TransientObjectException。这通常发生在您创建新对象的整个图形但没有显式保存所有对象时。有两种方法可以解决此问题:

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

我建议阅读 Hibernate 文档中的整章,以充分理解瞬态、持久和分离的术语:

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

【讨论】:

【解决方案2】:

dude 在映射中使用属性 "cascade = true"。一切都会好的…… V-Boy

【讨论】:

    【解决方案3】:

    对于多对一关系,Hibernate 不适合级联持久性操作,因为“一个”在概念上是许多其他实体之间共享的实体。这种关系不是你所说的“子对象”。

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

    【讨论】:

    • 斯卡夫曼,感谢您的澄清。我刚刚阅读了 brd6644 建议的文档。它有助于更​​好地理解 Hibernate 的一些基本概念。最终,我需要一些帮助来弄清楚如何能够在不将操作级联到与消息关联的用户/HD 的情况下更新消息。
    【解决方案4】:

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

    【讨论】:

    • 这是什么意思?这是怎么回答的?
    猜你喜欢
    • 2011-07-21
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2014-08-22
    • 2011-09-20
    相关资源
    最近更新 更多