2017-04-11 27 views
0

我目前正在研究一對多的hibernate xml映射。我想將記錄插入到兩個表(MERCHANT_INFO,MERCHANT_SERVICE)中。不更新條目。 eventhough我使用如下保存daoImpl類,一對多的hibernate xml映射與組合鍵生成更新語句,而不是插入

getHibernateTemplate().save(objMerchantInfoEntity); 

休眠正在產生一些更新語句如下

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

可我知道爲什麼最後兩個語句來爲在更新,而不是插入?

ONE側 - > MERCHANT_INFO表的主鍵:MID 許多副 - >商戶服務表複合鍵: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> 

回答

0

,因爲你正在使用MerchantServiceEnti ty參考MerchantInfo類。據我所知,當你試圖保存一個分離的實體時,hibernate並不知道在MerchantServiceEntity引用變量中是否有任何變化,因爲它不處於被管理狀態。所以,他試圖在這種情況下更新屬性。

+0

我懷疑這裏的問題是複合鍵。其中一個密鑰(MID)是從父表(序列)更新的外鍵,另一個密鑰(SERVICE_CODE)需要手動分配。所以當我分配這個鍵的時候,hibernate會認爲它是可用鍵並生成更新語句。 – jAnA

相關問題