-->
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.  [ 3 posts ] 
Author Message
 Post subject: Inheritance Mapping + List-Mapping
PostPosted: Wed Jun 18, 2008 1:46 pm 
Newbie

Joined: Thu Apr 19, 2007 5:43 am
Posts: 4
Location: Solingen, .de
Hallo zusammen,

ich verwende Hibernate 3 mit dem HibernateDaoSupport von Spring.

Ich habe eine Klassenhierarchie auf eine einzelne Tabelle gemappt, und zwar eine Superklasse "Verbrauchswert" mit zwei Subklassen "HeizungsVerbrauchswert" und "WasserVerbrauchswert" mit Diskriminatorwerten "H" und "W". Dieses Mapping funktioniert problemlos.

In einer Klasse "Gebaeude" habe ich eine List<HeizungsVerbrauchswert> heizungsVerbrauchswerte und analog eine Liste von Wasserverbrauchswerten. Diese beiden Lists habe ich wie folgt gemappt:

Code:
<list name="heizungsVerbrauchswerte" cascade="all" lazy="false">
    <key column="id_gebaeude" />
    <index column="idx" />
    <one-to-many class="HeizungsVerbrauchswert"  />
</list>


und analog für die Wasserverbrauchswerte.

Persistieren ist kein Problem, die Verbrauchswert-Listen werden genau wie gewünscht in die Datenbank geschrieben und der Listen-Index wird auch korrekt gespeichert, ebenso wie der Diskriminatorwert.

Beim Lesen aus der DB gibt es allerdings eine Exception weil beim Füllen der Liste der Heizungsverbrauchswerte ein Wasserverbrauchsobjekt dabei ist, woraufhin es zu "object was not of the specified subclass" kommt. Ich führe das momentan darauf zurück, dass beide Klassen sich den gleichen Fremdschlüssel (id_gebaeude) teilen, und dass Spring oder Hibernate dann nicht erkennen kann, welcher Typ gerade geladen wird. Ich hätte allerdings erwartet, dass hierbei der Diskriminator herangezogen wird, um eine Unterscheidung durchzuführen.

Ich habe jetzt das Problem umschifft, indem ich zwei statt einer Fremdschlüssel-Spalte angelegt habe: id_gebaeude_h für die Heizungswerte, id_gebaeude_w für die Wasserwerte. Das List-Mapping habe ich dann jeweils entsprechend angepasst. Die Exception fliegt dann nicht mehr.

Ich möchte aber eigentlich nicht mit zwei Fremdschlüsselspalten arbeiten.

Ist das Problem verständlich dargestellt? Was kann man in so einem Fall unternehmen? Funktioniert ein table-per-class-hierarchy Mapping nicht wenn man innerhalb einer Klasse zwei Listen mit jeweils einer der Subklassen halten will? Viele Fragen - hoffe auf fachkundige Antworten :-)

Einen angenehmen Abend allen Forumsmitgliedern.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 18, 2008 1:59 pm 
Newbie

Joined: Thu Apr 19, 2007 5:43 am
Posts: 4
Location: Solingen, .de
Alternativlösung: beim list mapping

Code:
where="typ='W'"
und
Code:
where="typ='H'"


angeben. Ist das die offizielle Lösung?


Top
 Profile  
 
 Post subject:
PostPosted: Sat Jun 21, 2008 11:25 am 
Pro
Pro

Joined: Tue Jun 12, 2007 4:13 am
Posts: 209
Location: Berlin, Germany
Hi rspielman,

das sollte eigentlich problemlos funktionieren. Allerdings kann folgendes das Problem sein:
Quote:
<index column="idx" />


Ich denke, für deine beiden Listen brauchst du separate Index-Spalten!

Ansonsten: sofern du keine SQL-Queries verwendest, brauchst du in where-Bedingungen auch nicht auf Diskriminatoren zurückgehen - das macht Hibernate schon selber bei der SQL-Generierung.

_________________
Carlo
-----------------------------------------------------------
please don't forget to rate if this post helped you


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

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.