Hi zusammen,
ich hab eine Klasse B von A abgeleitet. Beide sind auf die Tabelle T_AB gemappt. Eine column discriminator unterscheidet zwischen beiden Klassen - alles nach Vorschrift.
Lade ich eine Instanz von B direkt, also per query mit "select from B" oder per load oder get, funktioniert auch alles.
Das generierte SQL endet brav mit einem " ...where discriminator=discriminator_von_B".
Nun das Problem:
Ich habe eine Klasse C die eine one-to-many Beziehung zu B hat. Lade ich nun C und eine Liste von B (per Hibernate.initialize, eager fetch, etc.) wird immer alles geladen. Das heißt es werden nicht nur die Zeilen geladen, die durch den Diskriminator B eindeutig identifizieren sondern eben alle. Im generierten sql fehlt dann auch die where-clause die die Unterscheidung realisiert.
hier die mapping Dateien für A und B:
<hibernate-mapping>
<class name="BaseCoverageArea"
table="coverage_area" >
<composite-id>
<key-property name="carrierId" column="SUPPLIERID"/>
<key-property name="countryId" column="COUNTRYID"/>
</composite-id>
<discriminator column="ISDELETED" type="boolean"/>
<subclass name="CoverageArea" discriminator-value="false">
<many-to-one name="supplier" class="Supplier" column="SUPPLIERID"
insert="false" update="false" />
</subclass>
</class>
</hibernate-mapping>
hier die mapping datei in der die Assoziation abgebildet ist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="Supplier" table="supplier" >
<id name="carrierId" type="long" column="carrierid">
<generator class="assigned"/>
</id>
<property name="carrierName" column="CARRIERNAME" type="string"/>
<property name="description" column="description" type="string"/>
<bag name="coverageAreas" >
<key>
<column name="SUPPLIERID" />
</key>
<one-to-many not-found="ignore" class="CoverageArea"></one-to-many>
</bag>
</class>
</hibernate-mapping>
hier der Zugriff, der das richtige Ergebnis liefert:
String hql="from CoverageArea "
hier der Zugriff der das falsche Ergebnis liefert:
Supplier supplier=(Supplier)getSession().get(Supplier.class,new Long(4));
Hibernate.initialize(supplier.getCoverageAreas());
|