【问题标题】:One to many hibernate xml mapping with composite key generating update statements instead of insert使用复合键生成更新语句而不是插入的一对多休眠 xml 映射
【发布时间】:2017-09-06 05:26:41
【问题描述】:

我目前正在处理一对多的休眠 xml 映射。我想将记录插入两个表(MERCHANT_INFO、MERCHANT_SERVICE)。不更新条目。尽管我在 daoImpl 类中使用如下保存,

 getHibernateTemplate().save(objMerchantInfoEntity);

Hibernate 正在生成一些更新语句,如下所示

 Hibernate: insert into MERCHANT_INFO (MID,...) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
 Hibernate: update MERCHANT_SERVICE set TXN_MIN=?, TXN_MAX=?, POS_ID=?, STATUS=?, UPDATED_BY=? where SERVICE_CODE=? and MID=?
 Hibernate: update MERCHANT_SERVICE set TXN_MIN=?, TXN_MAX=?, POS_ID=?, STATUS=?, UPDATED_BY=? where SERVICE_CODE=? and MID=?

我可以知道为什么最后两个语句是作为更新而不是插入来的吗?

一侧 -> MERCHANT_INFO 表主键:MID 多方 -> MERCHANT SERVICE 表复合键:MID,SERVICE_CODE(MID 是 MERCHANT_INFO 表的外键)

在 MerchantInfo.hbm.xml..

<set
    name="merchantServices" 
    lazy="true"
    inverse="true"
    cascade="save-update"
>
    <key>
        <column name="MID" not-null="true" />
    </key>
    <one-to-many
        class="com.en.common.entity.MerchantServiceEntity"
    />
</set>

在 MerchantService.hbm.xml..

<composite-id name="comp_id" class="com.en.common.entity.MerchantServicePK">
        <key-property
            name="serviceCode"
            column="SERVICE_CODE"
            type="java.lang.String"
            length="32"
        />
        <key-property
            name="merchantId"
            column="MID"
            type="java.lang.Long"
            length="38"
        />
    </composite-id>
...
<!-- bi-directional many-to-one association to MerchantInfo -->
    <many-to-one
        name="MerchantInfoEntity"
        class="com.en.common.entity.MerchantInfoEntity"
        update="false"
        insert="false"

    >
         <column name="MID" />
    </many-to-one>

【问题讨论】:

    标签: xml spring hibernate spring-mvc


    【解决方案1】:

    因为,您在 MerchantInfo 类上使用 MerchantServiceEntity 参考。据我所知,当您尝试保存分离的实体时,休眠不知道 MerchantServiceEntity 引用变量中是否有任何更改,因为它不处于托管状态。因此,他尝试在这种情况下更新属性。

    【讨论】:

    • 我怀疑这里的问题是复合键。其中一个键(MID)是从父表(序列)更新的外键,另一个键(SERVICE_CODE)需要手动分配。因此,当我分配该键时,休眠将其视为可用键并生成更新语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多