2009-05-20 3 views
2

Ich habe eine Datenbanktabelle, die aus Ländern besteht. In meinem DAO, die HibernateDAOSupport die folgende Methode ...Warum generiert die loadAll() - Methode von Spring's HibernateTemplate Updates für jede Zeile?

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

... generiert die folgende Aktivität erweitert:

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 

Die Methode funktioniert jedoch. Ich bekomme meine Länderliste, aber was ist mit all den Updates?

Mein Mapping für diese Klasse ist nicht sehr exotisch:

<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> 

jemand mich in der richtigen Richtung zeigen kann? Warum würde loadAll Updates auslösen?

Antwort

3

Hibernate denkt anscheinend, dass die Werte, die es aus der DB geladen hat, sich geändert haben, also werden die Updates geleert.

Sie können einfach 'mutable = "false"' in der Klassenzuordnung festlegen, was die Aktualisierungen stoppen sollte, aber das ist nicht ideal.

Versuchen Sie, 'dynamic-update = "true"' für das Klassen-Mapping einzustellen, und das zeigt zumindest an, welche Spalte Hibernate denkt, dass sie aktualisiert werden muss. Werden die Werte in der Länder Tabelle in irgendeiner Weise geändert? Ich denke, wenn Sie Debug-Logging für das org.hibernate.type-Paket setzen, erhalten Sie auch eine Debug-Ausgabe, die anzeigt, welche Werte für die Update-Anweisungen gebunden sind.

Diese Art von Effekt kann auftreten, wenn das Modellobjekt versucht, clever zu sein - z. Trimmen von Leerzeichen, wodurch der Wert geändert wird, den die Datenbank nicht erhält.

+0

Danke für den Tipp auf dynamic-update. Es scheint, dass die Eigenschaften, die die Probleme verursachen, Zeichenfelder sind. Jetzt muss ich graben und herausfinden, wie man Zeichenfelder bestimmter Größe abbildet ... sollte ich nur Zeichenfolgen verwenden? – Boden

+1

Ah, Sie haben Char (2) und Char (3) Character Arrays der Länge 2 und 3? Ich denke, Sie haben die Java-Funktion getroffen, dass Arrays nicht gleichwertig() implementieren, indem Sie paarweise Vergleiche durchführen, nur nach Identität. Also, wenn Hibernate sah, ob das duplizierte Array gleich war, bekam es falsche Treffer. Ja, ich würde die Verwendung von Zeichenfolgen empfehlen. Möglicherweise haben Ihre Setter eine IllegalArgumentException ausgelöst, wenn jemand versucht, den 2-stelligen Code beispielsweise auf eine 3-stellige Zeichenfolge zu setzen. – araqnid

+0

Danke, ich habe genau das gemacht und es funktioniert gut. Lerne hier alle zehn Minuten etwas Neues! :) – Boden