Frage Applikation mit sehr vielen gleichartigen Tabellen

lieschen89

Mitglied
Hi,

ich hatte bis jetzt immer mit hiberante gearbeitet, wo man quasi für jede Tabelle eine Klasse hat, die diese Tabelle modelliert und dazu dann noch ein Dao.

Nun habe ich aber eine Anwendung mit gut > 50 Tabellen, welche allerdings vom Aufbau her alle gleich sind, bis auf den Namen der Tabelle natürlich.
(Bsp. zur Veranschaulichung: Datenbank in der alle Auto-'Typen' gespeichert sind mit Typ und Baujahr. Allerdings nicht in einer riesigen Tabelle, sondern jeder Hersteller (BWM, Fiat, VW, etc.) bekommt eine eigene Tabelle:
BMW
Typ Baujahr
3er 1990
1er 2004

VW
Typ Baujahr
Polo 1 1970
Lupo 1990
....)

Jetzt meine Frage, wie mach ich das am besten? Ich möchte jetzt nicht über 50 Domain Klassen und über 50 Dao Klassen implementieren müssen.

Logik gibt es nicht viel, es werden nur neue Datensätze erfasst und Datensätze gelöscht.


Noch ein kleiner Zusatz:
Datenerfassung/Abfragen:
Die Daten werden in einem Rutsch erfasst, d.h. hier dann immer wieder das zugehörge Objekt (BMW.Service.save(bmw)) nehmen ist genauso doof. Das sollte in der Lösung natürlich ein besser gestlaten werden.

Mein einziger Ansatz den ich bis jetzt habe ist, einfach über sql und einer Liste an Tabellennamen zu arbeiten.
Also via
insert into tabellennamen.get(i) ......


Dann könnte ich hibernate aber komplett über Board werfen oder?

Hat jemand vielleicht eine bessere Idee oder einen Tipp?
 

Writtscher

Mitglied
Hibernate Single Table Inheritance ist der beste Weg :). Um 50 Domain Klassen wirst du dann nicht rum kommen aber es reicht ein Dao. Das hat den Vorteil, dass du für jede Marke (BMW, Audi ...) eigenes Verhalten implementieren kannst. Und das erspart stupides geswitche oder ewiges IF THEN ELSE im Code.

Sollte das nicht dem Entsprechen, was du dir Vorstellst, dann einfach ein Objekt Auto und dann ein Enum Typ. Wirst damit auch mit einem Dao auskommen. Da du hier aber keine speziellen Objekte hast, wirst du schwitchen oder If THEN ELSE Konstrukte haben.

http://en.wikibooks.org/wiki/Java_P...#Example_single_table_inheritance_annotations

Gruß

Edit: Sorry hatte nicht gelesen, dass jede Klasse eine eigene Tabelle bekommt. Dann brauchst du Hibernate Inheritance Table Per Class

http://en.wikibooks.org/wiki/Java_Persistence/Inheritance#Table_Per_Class_Inheritance
http://viralpatel.net/blogs/hibernate-inheritence-table-per-hierarchy-mapping/
 
Zuletzt bearbeitet:

lieschen89

Mitglied
wow, danke für die schnelle Antwort.

Hibernate Single Table Inheritance

Ich hatte mir Vererbung schon angeschaut (Vorallem weil dann in den Domain-Klassen nicht so viel gleicher Code steht), allerdings habe ich da Bedenken wegen der Performance (kenn mich da gar nicht aus).
Bei Hibernate Single Table Inheritance werden die Daten ja alle in eine Tabelle gepackt.
Da werden sich schon einige Daten anhäufen (ka. öhm sagen wir, pro Tabelle pro Jahr 1.200 Datensätze), wenn ich die jetzt in eine Tabelle packe, dann wären dass ja 1.000.000 Datensätze. Und die Situation, dass ich wirklich Daten von allen Tabellen durchsuchen möchte in einer Abfrage tritt nie auf. Die meisten Aufrufe würde lediglich nur auf 1 Tabelle gehen.
Ist das dann nicht viel schneller, so eine Abfrage auf 1.200Datensätze als immer auf 1.000.000 laufen zu lassen?

Ansonsten hätte ich keine Einwände.


Das mit dem Enum versteh ich nicht ganz.
Du meinst ich habe alle Domain und Dao Klassen, nur eben die Logik zum Speichern/Löschen bestimme ich dann über das Enum (anstatt über eine Liste von Tabellennamen)?
 
Zuletzt bearbeitet:

Writtscher

Mitglied
Wie gesagt, es gibt noch Table Per Class Vererbung. Dann wirst du nicht alle Daten in eine Tabelle speichern. Zu deinen Perfomancebedenken: Da du hier über eine Tabelle ohne irgendwelche Join (nehme ich jetzt mal an) gehst, und auf den IDs und dem Discriminator ein Index liegt, wird die Datenbank kurz husten und du hast deine Datensätze.

Aber ich bin kein DB Mensch. Einfach mal Testen. Also Single Table vs Table Per Class.
 

Writtscher

Mitglied
Enum beispiel:

Code:
@Entity
@Table(name = "auto")
public class Auto {
    @Enumerated(value = EnumType.STRING)
     private Typ typ;

     ... weitere Felder ......
}

Code:
public enum Typ {
    BMW,AUDI,MERCEDES
}

Code:
public class AutoDao {
    public List<Auto> findeAutosAnhandVonTyp(Typ typ) {
    return entityManager.createQuery("select a from Auto a where a.type = :typ", Auto.class)
              .setParameter("typ", typ).getResultList();  
    }
}

Aber der Code würde auch alles in einer Tabelle speichern.
 

lieschen89

Mitglied
ok dann probier ich das mal aus.

Single Table hab ich das Problem, dass, wenn ich die Oberklasse anspreche er logischerweise auch über alle Tabellen geht, so wie ich gelesen habe (käme dann wahrscheinlich der 1-Tabellen variante gleich). Und einzeln mit den Untertypen werd ich die Objekte nicht ansprechen, wie gesagt, das sind mir zu viele.
 

lieschen89

Mitglied
hört sich interessant an, anschauen werd ichs mir mal. Aber für das aktuelle Problem weiß ich nicht obs mir hilft, da das Problem ja gerade die Objekte darstellen.

Hab jetzt mal so was ähnliches wie de Enum-Ansatz wie Writtscher vorgeschlagen hat umgesetzt und mich von meinen einzelnen Tabellen verabschiedet. Hab jetzt
eine Klasse Automarke mit id, Name Standort Gründung und
eine Klasse Typ mit id automarke_fk name baujahr etc.

So brauch ich nur zwei Klassen.
Und kann auch einfach durch drüber itereieren über die Tabelle Automarke neue Typen anlegen oder loeschen für alle Automaken und muss nicht immer ein neues ObjektVW oder neues ObjektBMW erzeugen.

Falls ich jetzt dann auch noch ne Autmarke im Nachhinein hinzunehmen möhte muss ich nichts im JavaCode anpassen sondern muss nur den Datensatz in die Automarken Tabelle einfügen und fertig.

Wenn die Abfragen jetzt dann trotzdem noch einigermaßen fix sind bin ich zufrieden.
 

Neue Beiträge