为什么Spring HibernateTemplate loadAll()方法会为每一行生成更新?

时间:2009-05-20 16:20:34

标签: hibernate spring

我有一个由国家组成的数据库表。在我的DAO中扩展了HibernateDAOSupport以下方法......

public List<Country> getCountries() {
    return getHibernateTemplate().loadAll(Country.class);
}

...生成以下活动:

Hibernate: update countries set name=?, iso_alpha_2=?, iso_alpha_3=? where id=?
Hibernate: update countries set name=?, iso_alpha_2=?, iso_alpha_3=? where id=?
Hibernate: update countries set name=?, iso_alpha_2=?, iso_alpha_3=? where id=?
...
once for each row

然而,该方法有效。我得到了我的国家列表,但所有更新都是什么?

我对这个班级的映射并不是非常奇特:

<class name="Country" table="countries">
    <id name="id" column="id">
        <generator class="identity"/>
    </id>
    <property name="name" column="name"/>
    <property name="alpha2" column="iso_alpha_2" />
    <property name="alpha3" column="iso_alpha_3" />
</class>

有人能指出我正确的方向吗?为什么loadAll会触发更新?

1 个答案:

答案 0 :(得分:3)

Hibernate显然认为它从数据库加载的值已经改变,所以它正在刷新更新。

您可以在类映射中设置'mutable =“false”',这应该会停止更新,但这并不理想。

尝试在类映射上设置'dynamic-update =“true”',这至少会显示Hibernate认为需要更新的列。国家/地区表中的值是否实际上以任何方式更改?我想如果你在org.hibernate.type包上设置调试日志记录,你也会得到调试输出,显示更新语句绑定的值。

如果模型对象试图变得聪明,就会发生这种效果 - 例如修剪空格,更改数据库不保留的值。