2010-07-27 37 views
3

这里是我的映射的一部分:休眠:在删除+插入组合元素结果在每次提交

<hibernate-mapping package="trx.domain"> 
    <class name="Master" table="master" dynamic-update="true" dynamic-insert="true"> 

     <set name="attributes" table="attribute" lazy="true" 
      cascade="all" batch-size="10"> 
      <cache usage="nonstrict-read-write" /> 
      <key> 
       <column name="master_id" /> 
      </key> 
      <composite-element class="Attribute"> 
       <many-to-one name="type" class="AttributeType" 
        not-null="true" column="attribute_type_id" lazy="false" /> 
       <property name="value"> 
        <column name="value" /> 
       </property> 
      </composite-element> 
     </set> 
    </class> 
</hibernate-mapping> 

如果我只是扫描attributes集,没有任何更新,休眠仍将执行批处理的delete并提交insert操作。

Hibernate: delete from attribute where master_id=? and attribute_type_id=? 
Hibernate: delete from attribute where master_id=? and attribute_type_id=? 
Hibernate: insert into attribute (master_id, attribute_type_id, value) values (?, ?, ?) 
Hibernate: insert into attribute (master_id, attribute_type_id, value) values (?, ?, ?) 

为什么发生这种情况?如何预防它?

回答

4

根据Hibernate Reference

因为Set的结构,Hibernate并不当一个元件被“变为”更新的行。对Set的更改始终通过INSERT和DELETE各个行来工作。

如果Hibernate试图更新您的,即使你不修改它集,也许在Attribute类的equalshashcode实现被打破?

+0

这工作,非常感谢。 – 2010-07-27 10:10:24