Hibernate Tabellen anlegen

Status
Nicht offen für weitere Antworten.

MQue

Top Contributor
Hallo,

wenn man hibernate konfiguriert, dann benötigt man eine "hibernate.cfg.xml" und dann noch je eine "*.hbm.xml" pro Tabelle welche man anlegen möchte.

So weit so gut, das klappt bei mir auch alles.
Nun habe ich den Auftrag, wenn der Server schon gestartet ist und wenn bestimmte Eingaben von einem Frontend am Server empfangen wurden, neue Tabellen je nach Eingabe zu erzeugen -> quasi per Software das machen, was man normal deklarativ macht.
Da liegt jetzt mein Problem, funktioniert das bzw. wie kann man das machen?
Hab schon gegoogelt aber nichts passendes gefunden, weiß aber auch nicht so recht ob meine Suchbegriffe richtig waren.


Vielen Dank,
lg
 
Bei dem Problem habe ich auch schon länger überlegt.
Ich hatte das Glück, meinem Chef ausreden zu können, dass neue Entities im laufenden Betrieb erstellt werden können.

Das Einzige, das mir eingefallen ist, war über Reflection die Klassen zu erzeugen und "manuell" per JDBC die entsprechende Tabelle in der Datenbank anzulegen. (Tabellen werden ja nur beim Deployen angelegt)
Großer Nachteil der Methode ist aber, dass die Klassen beim nächsten Deployment wieder weg sind.

Anderer Ansatz wäre, die neuangelegten Dinge über JDBC manuell zu lösen.
 
Wenn so ein Fall vorliegt tippe ich stark darauf dass das zugrundeliegende Design einen Denkfehler hat. Eigentlich sollte es möglich sein, ein Datenbankschema für eine Applikation zu entwerfen, an dem sich dann während des laufenden Betriebes nichts mehr ändert.
 
Wenn so ein Fall vorliegt tippe ich stark darauf dass das zugrundeliegende Design einen Denkfehler hat. Eigentlich sollte es möglich sein, ein Datenbankschema für eine Applikation zu entwerfen, an dem sich dann während des laufenden Betriebes nichts mehr ändert.

Ja, ist schon klar, das man normalerweise das Schema designed und auf diesem Schema dann die Applikation aufbaut und nicht die Applikation das Schema erzeugt,
in meinem Fall ist die Sache ein bisschen anders gelagert - wie ich schon öfter geschrieben habe - der Zuständige für das Design hat fast keine Ahnung, wie man eine Web- Anwendung aufbaut und reimt sich das so aus dem Stehgreif zusammen. Ich habs immer wieder versucht, so weit es mir möglich ist, ihn in die richtige Richtung zu leiten, mit eher bescheidenem Erfolg.

Aber grundsätzlich gebe ich dir recht, auch wenn ich vor kurzem einen Test bzgl. der Zugriffszeiten auf Tuples gemacht habe,

1. 1 Mio Datensätze aus einer Tabelle holen, wo nur zusammengehörende Datensätze drinn sind (also alle Datensätze vom gleichen Typ) oder
2. 1 Mio Datensätze aus einer Tabelle holen, wo verschiedene Datensätze drinnen sind.

1. ist um den Faktor 2-4 schneller als 2. bei einer Firebird- Datenbank.

lg
 
Verstehe nicht den Unterschied zwischen den beiden von Dir getesteten Varianten. In einer Tabelle sind doch immer unterschiedliche Datensätze!?

Und ansonsten.. vielleicht hast Du auch noch nicht lange genug über das Datenbankdesign nachgedacht. Es gibt mit ziemlicher Sicherheit irgendeine Variante, die Deinen Anwendungsfall performant abdeckt.
 
wenn der Server schon gestartet ist und wenn bestimmte Eingaben von einem Frontend am Server empfangen wurden, neue Tabellen je nach Eingabe zu erzeugen
sicher? Wie schaut genau der Business Case dahinter aus? So sollte normalerweise nicht gearbeitet werden...
 
bei Hibernate sind in den Mappings konkrete Klassennamen angegeben und diese müssen beim ersten Zugriff vorhanden sein,
was sollte es bringen, dynamisch beliebige Tabellen anzulegen, wenn das Mapping eh nicht geändert werden kann?

und selbst wenn, wozu braucht man die neuen Tabellen in Hinsicht auf Hibernate?
Hibernate macht doch nur Sinn, wenn man es auch im Quellcode benutzt, wenn man eine Tabelle PERSON_TABLE hat, eine Java-Klasse Person
und 10 Business-Methoden mit HQL 'Select p.name from Person p'

dynamisch angelegte Tabellen machen mit Hibernate zusammen keinen Sinn,
es gibt allerhöchstens Tools, die quasi vor Programmstart einmalig die gemappten Klassen analyisieren und daraus initial eine Datenbank erstellen

http://www.myeclipseide.com/PNphpBB2-viewtopic-t-18641.html
 
Dafür scheint JPA nicht geeignet zu sein. Aber ich habe so etwas schon mal mit einer Objektorientierten Datenbank gemacht (db4o). Klassen habe ich als Groovy Dateien definiert und zu Laufzeit geladen ... Das hat gut funktioniert. db4o hat sogar erkannt, wenn eine Klasse geändert wurde und hat die bereits gespeicherten Objekte einfach angepasst.

liebe Grüsse
 
rein theoretisch funktioniert das schon, indem man einfach in hibernate.cfg.xml folgende Option hinzufügt:
[XML]<property name="hibernate.hbm2ddl.auto">create</property>[/XML]

Das macht man aber nur ein eiziges Mal, und zwar bei der Schemainitialisierung. Danach sollte diese Option einfach verschwinden...

Die Möglichkeit Tabellen dynamisch zu erzeugen wundert mich ehrlich gesagt... Kann mir jemand verraten, was für ein Sinn dahinter steckt ? Persistenz heißt eingentlich, dass die Sachen persistent sein müssen...
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben