2009-08-06 7 views
2

In meiner Hibernate-Anwendung gibt es Annotation-gesteuerte Objekt: AuditEvent. Es ist sehr einfach und hat keine Fremdschlüsselbeziehungen. Ich archiviere alte Einträge in dieser Tabelle, indem ich sie in eine andere Tabelle verschiebe OldAuditEvent, die ein Klon der AuditEvent Tabelle ist.Clone die Definition einer Tabelle mit Hibernate (hbm2ddl)

Gerade jetzt erzeugen wir die DDL für die gesamte Anwendung hbm2ddl mit (auf unserem kommentierten Datenmodell) und manuell Kopieren/Einfügen die AuditEvent Tabelle und seinen Namen OldAuditEvent erstellen ändern.

Ich möchte den Build-Prozess automatisieren, gibt es eine Möglichkeit zu sagen, hbb2ddl: "Hey nehmen Sie diese Entität, ändern Sie den Tabellennamen in X und neu erstellen es ist DDL"?

Aktualisieren: Ich war in der Lage, dies durch den von Ihnen beschriebenen Ansatz zu erreichen. Das einzige Problem war, die AnnotationSessionFactoryBean zu bekommen, da es sich um eine Factory-Bean handelt und die Quelle nur die Ausgabe ihrer Factory liefert. Ich habe ConfigExposingAnnotationSessionFactoryBean (AnnotationSessionFactoryBean erweitern) erstellt, um die Bean-Factory durch eine statische Art zu offenbaren - eine Art Hack, aber ich möchte nur eine Build-Time-Aufgabe ausführen.

Antwort

2

Es ist machbar, aber ziemlich chaotisch und höchstwahrscheinlich nicht wert in diesem Fall

Sie müssen das Hibernate-Objekt Configuration dynamisch ändern, bevor SessionFactory erstellt wird. Ich verwende Spring, dies kann durch Überschreiben postProcessAnnotationConfiguration() Methode AnnotationSessionFactoryBean; Andernfalls müssen Sie es nur mit Ihrem Configuration Objekt ausführen, bevor Sie buildSessionFactory() darauf aufrufen.

Sie können über configuration.getMappings() auf Klassen-/Tabellenzuordnungen zugreifen. Sie müssen dann Ihr Tabellen-Mapping über getTable() finden, eine Kopie mit neuem Namen über addTable() erstellen und alle Spalten/Schlüssel über Table API replizieren.

Sie können dann das DDL-Skript über generateSchemaCreationScript() oder generateSchemaUpdateScript() Methoden von Configuration Objekt generieren.

Wie gesagt, wahrscheinlich ist es in diesem Fall nicht wert :-)

+0

Ich werde das versuchen und sehen, ob es funktioniert! Selbst für 2 Tabellen denke ich, dass es das wert ist - manuelle Schritte in einem plattformübergreifenden Build-Prozess ziehen Dinge herunter und verursachen unerwartete Probleme. – Justin

+0

Viel Glück bei Ihrer Implementierung. Der obige Ansatz funktioniert für mich, obwohl ich ihn für einen anderen Zweck verwende (Laufzeit-Entity-Mapping-Manipulation). Ich muss jedoch sagen, dass ich ziemlich verärgert bin über die Hibernate-Umordnung von Spalten im DDL-Skript - ich möchte die gleiche Reihenfolge beibehalten wie in Quellcode-Annotationen. Haben Sie das irgendwie gelöst oder ist das kein Problem für Sie? – ChssPly76

+0

Unser Entwicklungsprozess ist: mit Anmerkungen POJO -> DDL. Wir gehen immer durch Hibernate-Eigenschaftsnamen, sodass Spaltenpositionen nicht wichtig sind. Wenn Hibernate nach dem Zufallsprinzip neu geordnet wird, bedeutet das wahrscheinlich, dass Sie intern irgendwo eine HashSet/Map verwenden. Suchen Sie den Code, wechseln Sie ihn in ein TreeSet/Map und Sie erhalten möglicherweise eine beständige Reihenfolge? – Justin

Verwandte Themen