Here’s a part of my mapping:
<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>
If I simply scan the attributes set, without any updates, Hibernate would still execute a batch of delete and insert operations on commit.
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 (?, ?, ?)
Why is it happening? How to prevent it?
According to Hibernate Reference
If Hibernate tries to update your set even if you don’t modify it, maybe your
equalsandhashcodeimplementations inAttributeclass are broken?