【问题标题】:Exception during hibernate saveupdate org.hibernate.TransientObjectException:休眠保存更新 org.hibernate.TransientObjectException 期间的异常:
【发布时间】:2011-07-13 17:36:01
【问题描述】:

嗨,我有这样的休眠映射 类名="com.example.Company" 表="用户">

<many-to-one 
            class="com.example.Organization" fetch="join"
            name="consumer" lazy="false" not-null="false">
            <column name="ORGANIZATION_ID" />
        </many-to-one>
        <many-to-one 
            class="com.example.Organization" fetch="join"
            name="supplier" lazy="false">
            <column name="ORGANIZATION" not-null="false"/>
        </many-to-one>

在保存更新之前,我的数据库是这样的

公司表

COMPANY   ORGANIZATION_ID ORGAIZATION
1             4            NULL

organization table

id   name
4     xxxx

现在我的问题是当我尝试执行 saveorupdate org.hibernate.TransientObjectException: object references an unsaved transient instance - 在刷新之前保存瞬态实例:com.example.Organization。

我使用 cascade=all 但每次保存更新时都会在组织表中创建新行,因此我删除了 cascade =all

当我使用 casade =all 时,它正在工作,但它做了类似的事情

company table
COMPANY   ORGANIZATION_ID ORGAIZATION
1             4            5

组织表

organizationid name
4               xxxx
5              nulll

它创建空值。我该如何解决这个问题?

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    我从您的帖子中了解到,您正在尝试将供应商添加到现有的公司记录中。因此,您正在创建一个新的组织记录,将其与现有的公司记录附加并调用 saveOrUpdate()。因此,当您不设置 cascadeType=All 时,hibernate 当然会抱怨,因为您还没有在数据库中保存新的组织记录。当您使用 cascadeType=All 时,hibernate 将新的组织记录保存在数据库中,在您的情况下,该记录的 id=5,然后使用此 id 更新现有的公司记录。因此,hibernate 可以正常运行并执行您要求它为您执行的所有操作。也许您应该详细说明您的问题并说明您到底想做什么,因为您在帖子中提到的任何内容都是休眠的预期行为。

    【讨论】:

    • 嗨,我不想创建新的组织。 company table COMPANY ORGANIZATION_ID ORGAIZATION 1 4 null 组织表 organizationid name 4 xxxx 我希望更新后是这样的 谢谢
    • 所以你有一个现有的组织,即组织#4,你想成为 company#1 的供应商,因此设置 company#1.organization = 4。我正确吗? (变量后面的#指的是表中的主键,所以company#1指的是COMPANY表中主键=1的记录)
    • 公司有 2 个组织。我将它们设置在不同的上下文中。在公司表中,组织 ID 和组织都指组织表。当我尝试保存或更新公司时,我希望它保持不变 4 和公司表中为空。我不想创建新组织
    • 公司有 2 个状态活跃和非活跃我只是想改变状态和更新公司。在这种变化的状态下它创建了新的组织。我不想创建新的组织
    • 当您在 company#1 上调用 saveOrUpdate() 时,显然您正在创建一个新的组织实例。你应该做的是加载organization#4,调用company.setSupplier(organization#4),然后调用session.merge(company)。发布您的一些代码可以让您更清楚地了解您实际在做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多