使用复合键生成更新语句而不是插入

时间:2017-04-11 01:56:41

标签: xml spring hibernate spring-mvc

我目前正在进行一对多的hibernate 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表的forign键)

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

1 个答案:

答案 0 :(得分:0)

因为,您在MerchantInfo类上使用MerchantServiceEntity Reference。据我所知,当你尝试保存一个分离的实体时,hibernate不知道MerchantServiceEntity引用变量是否有任何变化,因为它不在托管状态。所以,他试图在这种情况下更新属性。