Hibernate: Tabelle-pro-Klassenhierarchie-Problem

pizza1234

Erfahrenes Mitglied
Hi,
gegeben sind:

Oberklasse Documents sowie Unterklassen PlaceholderDocuments und SignatureDocuments. Mein Problem ist, das ich bestimmte Elemente der Oberklasse brauche, aber auch immer Elemente der Unterklasse in meiner List habe:

Hier mal die hbm.xmls:

Documents:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="de.etss.core.db.domain">
    <class name="Documents" table="documents" catalog="etss" discriminator-value="D">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
		
	<discriminator column="document_type" type="string"/>
   
        <property name="title" type="string">
            <column name="title" length="55" />
        </property>

        <property name="comment" type="string">
            <column name="comment" length="500" />
        </property>

        <property name="fileSize" type="double">
            <column name="file_size" />
        </property>

        <property name="mimeType" type="string">
            <column name="mime_type" length="20" />
        </property>
        
        <property name="fileName" type="string">
            <column name="file_name" length="200" />
        </property>
       
        
        <property name="category" type="integer">
        	<column name="category"/>
        </property>
             
        <subclass name="SignatureDocumentst" discriminator-value="ST">
        	<property name="md5hash" type="big_decimal" column="hash"/>	
        </subclass>

        <subclass name="PlaceHolderDocuments" discriminator-value="PD">
        	<property name="template" type="boolean" column="template"/>
        	<property name="mandatory" type="boolean" column="mandatory"/>
        </subclass>
   </class>
</hibernate-mapping>


Wenn ich folgende Methode aus dem DAO aufrufe, bekomme ich die jeweiligen PlaceholderDocuments.Das macht Hibernate anhand des Discriminators automatisch.
Java:
	@Override
	public List<PlaceHolderDocuments> loadPlaceHolderDocuments(Affiliate affiliateId, Integer id)
	{
		return getHibernateTemplate().find(" from PlaceHolderDocuments d where d.template = ? and d.affiliate = ? and d.tenderType =? ",new Object[]{Boolean.TRUE,affiliateId,id});
	}

wenn ich aber folgendes aufrufe,
Java:
	@Override
	public List<Documents> loadStandardDocuments(Affiliate affiliate)
	{
		List<Documents> docs = getHibernateTemplate().find(" from Documents d where d.affiliate = ? and d.project is null ", new Object[]{affiliate});
		return docs;
	}
bekomme ich sowohl Documents mit Discriminator D und PlaceHolderDocuments mit Discriminator PD.

Wieso ist das so?Ich hab dafür doch extra in der hbm.xml den Discriminator D für die Oberklasse angegeben! Kann man evtl. die Oberklasse nicht mehr aufrufen, macht Hibernate sie abstrakt? Kann man den Discriminator irgendwie abfragen a la
(Pseudocode)
Java:
	@Override
	public List<Documents> loadStandardDocuments(Affiliate affiliate)
	{
		List<Documents> docs = getHibernateTemplate().find(" from Documents d where d.affiliate = ? and d.project is null and discriminator is D ", new Object[]{affiliate});
		return docs;
	}

oder kann ich jetzt nur noch mit Unterklassen arbeiten?Oder mach ich was falsch?

Ich hoffe, ich hab mich verständlich ausgedrückt!
Ach so, die fehlenden Variablen wie project und so sind natürlich vorhanden, ich wollte nur nicht die gesamte hbm.xml kopieren und hab sie ein wenig zusammengekürzt!
Grüße,
Peter
 
Zuletzt bearbeitet:
So,
eine funktionierende Lösung ist, den jeweiligen Classnamen mit anzugeben:

Java:
	@Override
	public List<Documents> loadStandardDocuments(Affiliate affiliateId)
	{
		List<Documents> docs = getHibernateTemplate().find(" from Documents d where d.affiliate = ? and d.project is null and d.class = Documents", new Object[]{affiliateId});
		return docs;
	}
 
Zurück