# Hibernate - Abgeleitete Klassen werden nicht angezeigt wenn...



## smung (15. Dez 2009)

Wie der Titel schon sagt werden bei mir die Abgeleiteten Klassen nicht angezeigt:
Ich habe einen Typ Adresse.
Von Adresse wurde Kunde und Lieferant abgeleitet.

Frage ich nun Adressen ab erscheint so lange kein Datensatz bis ich einen Datensatz vom Typ Adresse angelegt habe. Dann Tauchen auch alle Lieferanten und Kunden auf. Kunden und Lieferanten kann ich direkt abfragen und es kommen die richtigen Ergebnisse.

Kunde und Lieferant sind joined subclasses

Ist das Normal das man mindestens ein "ElternObjekt" haben muss?


----------



## maki (15. Dez 2009)

Denke dass Hibernate nicht dein Problem ist, sondern dass du Kunden & Lieferanten von Adressen erben lassen willst... :noe:


----------



## byte (15. Dez 2009)

Abgesehen davon, dass Vererbung hier recht sinnfrei ist (ein Kunde *ist *keine Adresse, er *hat *eine), zeig doch mal Code (Mapping, Query).


----------



## smung (15. Dez 2009)

Hier die Mappings:


```
<?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="address.Address" table="address">
    <id column="ID" name="id" type="long">
      <generator class="identity"/>
    </id>
    <property name="firstName">
      <column name="firstname"/>
    </property>
    <property name="lastName">
      <column name="lastname"/>
    </property>
    <property name="street">
      <column name="street"/>
    </property>
    <property name="oclass">
      <column name="oclass"/>
    </property>
    <joined-subclass name="address.Customer" table="customer">
      <key column="id"/>
      <property column="customerID" name="customerID"/>
    </joined-subclass>
    <joined-subclass name="address.Supplier" table="supplier">
      <key column="id"/>
      <property column="supplierID" name="supplierID"/>
    </joined-subclass>

  </class>
</hibernate-mapping>
```


```
List addresses = s.createQuery("from Address").list();
```

Und anzeigen soll er mir alle Adressen inklusive abgeleitete Klassen -> Kunden, Lieferanten, Sonstige usw.
Das Macht er wie gesagt erst, wenn er Mindestens 1 Adresse hat. Sonst zeigt nichts an.


----------



## byte (15. Dez 2009)

Ich denke, das funktioniert so nicht mit joined subclass. Du kannst Dir ja mal das erzeugte SQL angucken. Er wird in diesem Fall afaik alle Adressen selecten und dabei die Customers und Suppliers reinjoinen. Gibt es aber keinen Adressen, wird auch nichts gejoint.

Ich würde einfach statt joined subclass mit Discriminator arbeiten. Da gibts dann nur eine Tabelle für alle Adressen inkl. Subklassen.

Aber ganz ehrlich? Vererbung ist hier total fehl am Platze. Du solltest Komposition nutzen! Gib Klasse Supplier und Customer jeweils eine Referenz auf ein Objekt vom Typ Adress. Das könntest Du z.B. per one-to-one mappen, wobei ich davon abraten würde. Ich würde Adress einfach als Embedabble nutzen. One-To-One ist meistens sinnlos, weil man dadurch nur unnötig joinen muss.


Edit: Und wenn es doch umbedingt Vererbung sein muss, dann würde ich in Betracht ziehen, die Oberklasse per 
	
	
	
	





```
@MappedSuperclass
```
 mappen (kA wie das Pendant in XML heisst). Polymorphe Queries sind nicht ganz ohne. Ich würde darauf verzichten, wenn es nicht umbedingt sein muss.


----------



## smung (15. Dez 2009)

Alles in einer Tabelle ( Adressen + Kunden / Lieferanten spezifische Daten ) ist Datenbanktechnisch eher nicht vertretbar.

Ich denke das mit dem embeddable schau ich mir mal genauer an. Dann muss ich mir nur was neues einfallen lassen wie ich alle Adressen anzeigen lasse. Da muss dann ja nen union ran.


----------



## smung (23. Dez 2009)

Oh mann. Es funktioniert einwandfrei. Hatte den Schleifenzähler auf 1 gesetzt 
Das ist eine blöde angewohnheit aus unserer Makro Programmiersprache bei uns im Haus.

Also man kann schön abgeleitete Klassen nehmen!


----------

