Hibernate - Abgeleitete Klassen werden nicht angezeigt wenn...

smung

Mitglied
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?
 
Denke dass Hibernate nicht dein Problem ist, sondern dass du Kunden & Lieferanten von Adressen erben lassen willst... :noe:
 
Abgesehen davon, dass Vererbung hier recht sinnfrei ist (ein Kunde ist keine Adresse, er hat eine), zeig doch mal Code (Mapping, Query).
 
Hier die Mappings:

Java:
<?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>

Java:
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.
 
Zuletzt bearbeitet von einem Moderator:
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
Code:
@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.
 
Zuletzt bearbeitet:
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.
 
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!
 

Neue Themen


Zurück
Oben