-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: many-to-one in subclass (Wie one-to-many in subclass?)
PostPosted: Sat Jun 13, 2009 9:45 pm 
Newbie

Joined: Sat Jun 13, 2009 9:18 pm
Posts: 1
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


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.