Hallo,
wir entwickeln in unserer Firma eine Anwendung die als Prämisse Datenbank unabhängig sein soll. Dabei benutzen wir Hibernate als persistence-API, und orientieren uns an dessen Fähigkeiten, was die Modelierung des Datenmodels betrifft. Damit unsere Anwendung in jedem Fall mit einer leeren Datenbank starten kann, und um den Aufwand für Datenmodel Änderungen beim End-Kunden konsistent und klein zu halten, benutzen wir einen primitiven "UpdateManager", der bei Anwendungsstart sämtliche Änderungen seit dem letzten Release an der Datenbank durchführt und archiviert. Die Schnittstelle für ein solches Update muss generisch sein, soll aber Datenbank speziefisches SQL erzeugen. Wir verwenden daher einen Dialekt ähnlich wie Hibernate, der dabei sogar auf Hibernate aufsetzt. Ziel ist, dass beim Entwickeln beispielsweise nur angeben werden muss, dass eine Tabelle erzeugt werden soll, und welche Spalten sie hat. Der Dialekt entscheidet dann, ob zusätzlich eine IDENTITY Eigenschaft auf den Primär-Schlüssel gesetzt werden muss, eine Sequenz dafür erzeugt werden soll, oder ob auf einen Hi/Lo Algorithmus zurückgegriffen werden muss. Beim implementieren einer solchen "CreateTable" Klasse stellt sich mir nun die folgende erste Frage:
Wir verwenden für IDs die "native" Generator Strategie, um die Mappings generisch zu halten. Die Dokumentation sagt, dass bei dieser Strategie Hibernate selbst entscheidet, ob nun "identity", "sequence" oder "hilo" benutzt werden muss. Das passiert aufgrund der Fähigkeiten der verwendeten Datenbank, die sich für Hibernate im Dialect manifestieren (weswegen unserer Dialekt darauf aufsetzt). Es gibt jedoch Datenbanken wie DB2, die sowohl IDENTITY als auch SEQUENCE kennen. Woher weiß Hibernate nun, welches zu verwenden ist, bzw. wird vielleicht standardmäßig das eine oder das andere verwenden? Welches von beiden muss ich also in meiner "CreateTable" Klasse verfolgen, wenn beides möglich ist? Kann ich Hibernate diese Entscheidung abnehmen, indem ich das Mapping spezieller gestallte als nur '<generator class="native" />'? Wenn ja, wie? Die Dokumentation ist etwas dünn...
Ich danke im voraus!
MfG
Hibernate version: 3.2.6GA
|