Beim Design von Datenbanken stellen wir häufig fest, das Gruppen von Attributen in mehreren Entitäten vorkommen. Aus objektorientierter Sicht würden man hier auf eine Vererbung hinarbeiten. Leider sind solche Konstrukte in der Datenbank nicht direkt möglich. Hibernate bietet uns hier die Möglichkeit der Vererbung.
Als Beispiel nehmen wir an, das zu unseren Kunden Firmen und Personen gehören und alle über Bankdaten verfügen:

In Java würde diese Vererbung wie folgt aussehen:
@Entity @Table(name = "account_holders") @Inheritance(strategy = InheritanceType.JOINED) public abstract class AccountHolder { private String bankName; private String bankCode; private String accountNumber; ... } @Entity @Table(name = "persons") public class Person extends AccountHolder { private String firstName; private String lastName; ... } @Entity @Table(name = "companies") public class Company extends AccountHolder { private String name; ... } |
Neben der Vermeidung von doppelten Datenstrukturen in der Datenbank, zeigt sich hier ein weiterer interessanter Aspekt: Das Laden abstrakter Klassen!
Wenn wir im oben genannten Beispiel eine Liste aller Kunden (Personen und Firmen) mitsamt ihren Bankdaten laden wollen, reicht ein einziger Aufruf:
List<AccountHolder> clients = new AccountHolderDAO().getList(); |
Hiermit kann man viel Freude haben, wenn man alle Aspekte im Blick hat: Da Hibernate bei Aufruf noch nicht weiß, welche Daten für eine Instanz erforderlich sind, wird ein Join über die Tabelle der abstrakten Klasse selbst und der Tabellen aller Kindklassen erstellt. Dies kann bei einer tiefen oder weitläufigen Vererbungshierarchie durch große Joins die Performance spürbar drücken. Von einer Verwendung für häufig angehängte Daten würde ich daher Abstand nehmen.