Hallo,
ich habe ein Problem mit dem Erstellen einer many-to-one Beziehung einer Subclass in Hibernate.
In meiner Datenbank habe ich u.a. drei Tabellen: Task, Comment und TaskComment. TaskComment ist eine Unterklasse von Comment. Außerdem soll es von TaskComment zu Task eine many-to-one Beziehung geben.
Das ganze sieht also ungefähr so aus:
Task -----> * TaskComment ----> Comment
Also eigentlich nicht besonders schwer. Das Mapping sieht wie folgt aus:
Mapping für die Klasse Task:
Code:
<hibernate-mapping>
...
<class name="Task" table="task">
<id column="id" name="id">
<generator class="native"/>
</id>
...
<set inverse="true" lazy="true" name="comments">
<key column="task_id"/>
<one-to-many class="TaskComment"/>
</set>
...
</class>
</hibernate-mapping>
Mapping für Comment
Code:
<hibernate-mapping>
<class name="Comment" table="comment">
<id column="id" name="id">
<generator class="native"/>
</id>
<discriminator column="commenttype" type="string"/>
...
<subclass discriminator-value="1" name="TaskComment">
<join table="taskcomment">
<key column="id"/>
<many-to-one class="TaskComment" not-null="true" column="task_id" name="task"/>
</join>
</subclass>
...
</hibernate-mapping>
Mein Problem ist, dass ich auf die Beziehung weder in der Klasse Task noch in der Klasse TaskComment zugreifen kann, weil Hibenrate fehlerhafte SQL-Befehle ausführt. Um Objekte von TaskComment aus der DB zu lesen, wird von Hibernate
Code:
SELECT comment.task_id, comment...., taskcomment.task_id ... FROM comment... INNER JOIN taskcomment ...
ausgeführt. Die task_id wird von Hibernate also in beiden Tabellen erwartet (eigentlich sollte die nur in taskcomment stehen). Damit der Befehl ausgeführt werden kann, habe ich desshalb zur Tabelle comment die Spalte task_id hinzugefügt (also die gleiche Spalte einmal in comment und einmal in taskcomment).
Leider habe ich jetzt das nächste Problem: bei lesen der Beziehung über die entsprechende Methode in Task (Task->TaskComment) wird zum ermitteln der TaskComment Objekte aus der Datenbank die Spalte task_id in der Tabelle comment verwendet. Beim Lesen der Beziehung über TaskComment (TaskComment->Task) wird hingegen die Spalte aus taskcomment verwendet.
Je nachdem, in welcher Klasse ich bin, macht Hibernate also entweder
Code:
SELECT ... FROM comment ... INNER JOIN taskcomment ... WHERE comment.task_id = ?
oder
Code:
SELECT ... FROM comment ... INNER JOIN taskcomment ... WHERE taskcomment.task_id = ?
mit dem Ergebnis, das die Ergebnisse unterschiedlich sind, weil die Werte von task_id beim Speichern eines Objektes von Hibernate nur in taskcomment aber nicht in comment gespeichert werden. Die Spalte task_id in comment ist also komplett leer.
Kennt jemand eine Möglichkeit Hibernate beizubringen, dass die Beziehung nur in die eine Tabelle gehört?
Ich habe auch schon im Forum gesucht und auch einige passende Einträge (leider ohne Lösungen für mein Problem) gefunden (z.B.
https://forum.hibernate.org/viewtopic.php?f=1&t=977453&start=0).
Gruß
henninghu