这是我的映射的一部分:
<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
集,没有任何更新,Hibernate仍会在提交时执行一批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 (?, ?, ?)
为什么会这样?怎么预防呢?
答案 0 :(得分:4)
由于Set的结构,当元素被“更改”时,Hibernate不会更新行。对Set的更改始终通过单个行的INSERT和DELETE工作。
如果Hibernate尝试更新您的设置即使您没有修改它,那么equals
课程中的hashcode
和Attribute
实施可能会被破坏吗?