Hibernate: составной элемент приводит к удалению + вставке при каждом коммите - PullRequest
3 голосов
/ 27 июля 2010

Вот часть моего отображения:

<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 (?, ?, ?)

Почему это происходит? Как это предотвратить?

1 Ответ

4 голосов
/ 27 июля 2010

Согласно Hibernate Reference

Из-за структуры набора Hibernate не ОБНОВЛЯЕТ строку, когда элемент «изменен». Изменения в наборе всегда работают через INSERT и DELETE отдельных строк.

Если Hibernate пытается обновить ваш набор, даже если вы его не модифицируете, возможно, ваши реализации equals и hashcode в классе Attribute не работают?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...