Hallo zusammen,
Aus performancegründen will ich einer Tabelle zwei Klassen zuweisen. Die eine (Document) soll mit allen möglichen Daten gefüllt werden, die häufig geändert werden, die andere (DocumentBigData) soll vor dem Speichern des Dokuments mit großen, generierten Datenmengen gefüllt und extra gespeichert werden.
Rein technisch geht das soweit in Ordnung, wird kompilliert und läuft. Ich frage mich nur, ob eine solche "Beziehung" schonmal verwendet wurde, Hibernate auf eine solche Art überhaupt verwendet werden sollte und dabei nicht vielleicht Probleme beim Speichern der einen oder der anderen Klasse auftreten könnten.
Tatsächlich ist es nämlich so, dass, unter Verwendung dieses Mapping, Probleme in einer Anwendung auftauchen.
Zuerst soll ein Objekt der Klasse DocumentBigData upgedated werden, gleich darauf soll dann auch ein Objekt der Klasse Document upgedated werden.
Selten (aber nicht immer!) kommt es dann vor, dass, nachdem der erste Update wie immer gelang, der zweite mit folgender Meldung fehlschlägt:
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [Document#70625]
Randdaten:
Hibernate version:
3.1.rc2
Mapping:
Code:
<class name="Document" table="document">
<id name="ID" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
<version name="Version" type="java.lang.Integer"/>
<property name="Type" type="java.lang.Integer"/>
</class>
<class name="DocumentBigData" table="document">
<id name="ID" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="field1" type="binary"/>
<property name="field2" type="binary"/>
</class>
</hibernate-mapping>