2009-05-20 12 views
2

私は国々からなるデータベーステーブルを持っています。しかし、SpringのHibernateTemplateのloadAll()メソッドが各行の更新を生成するのはなぜですか?

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 

メソッドの動作:HibernateDAOSupport以下の方法拡張私のDAO ...

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

では...以下のアクティビティを生成します。私は国のリストを取得しますが、すべての更新プログラムは何ですか?このクラスの

私のマッピングがひどくエキゾチックではありません。

<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が更新をトリガーするのはなぜですか?

答えて

3

Hibernateは明らかに、DBからロードした値が変更されたと考えているため、更新をフラッシュしています。

クラスマッピングで 'mutable = "false"'を設定するだけで、更新を停止する必要がありますが、それは理想的ではありません。

クラスマッピングで 'dynamic-update = "true"'を設定すると、少なくともHibernateが更新が必要だと思う列が表示されます。国のテーブルの値は実際には何らかの形で変更されていますか? org.hibernate.typeパッケージにデバッグロギングを設定すると、更新ステートメントにどの値がバインドされているかを示すデバッグ出力も得られます。

このような種類の効果は、モデルオブジェクトが巧妙であることを試みる場合に発生します。空白を削除し、データベースが保持しない値を変更します。

+0

ダイナミックアップデートのヒントをありがとう。問題を引き起こすプロパティは文字配列であるようです。今私はいくつかの掘削を行い、特定のサイズの文字配列をマップする方法を理解しなければなりません...文字列を使うだけですか? – Boden

+1

ああ、長さ2と3の文字配列にchar(2)とchar(3)をマッピングしていましたか?私はあなたがペアでの比較を行うことによって配列がequals()を実装していないJavaの機能にヒットしたと思います。したがって、重複した配列が等しいかどうかを確認するためにHibernateが見たとき、それは誤ったヒットを得ていました。 はい、文字列を使用することをおすすめします。たとえば、2文字のコードを3文字の文字列に設定しようとすると、設定者がIllegalArgumentExceptionをスローする可能性があります。 – araqnid

+0

ありがとう、私はちょうどそれをし、それは正常に動作します。この場所を10分ごとに何か新しいことを学びましょう! :) – Boden