4 Stimmen

Erstellen von Datenbanken zur Laufzeit mit Hibernate?

Ist es möglich, mit Hibernate zur Laufzeit eine neue Datenbank zu erstellen (unter Verwendung der Annotationen der Modellobjekte als Schema, o aus einer normalen Schemadatei, die wir definieren), und dann eine Verbindung zu dieser Datenbank herstellen, damit sie verwendet werden kann?

Was wir tun möchten, ist, wenn eine bestimmte Aktion passiert (zum Beispiel ein neuer Benutzer erstellt wird), erstellen wir eine neue Datenbank für diesen Benutzer (aus den definierten Anmerkungen oder einfach ein statisches Schema), und haben dann ein Handle zu dieser Datenbank, so dass der Benutzer in sie schreiben kann.

Die Sache mit dem Benutzer dient lediglich der Veranschaulichung des Konzepts...

Danke!

6voto

matt b Punkte 135206

Um so etwas zu erreichen, muss man auf hohem Niveau vorgehen:

  1. Wenn das Trigger-Ereignis eintritt, führen Sie die DDL aus, um eine neue Datenbank über eine JDBC-Verbindung zu erstellen - wahrscheinlich ist es am sinnvollsten, wenn dieses Schema von hbm2ddl zur Erstellungszeit.

  2. Konstruieren Sie eine neue DataSource für diese Datenbank, und eine neue SessionFactory von der DataSource

  3. Este SessionFactory sollte dann in die Datenzugriffsschicht Ihrer Anwendung injiziert (oder von dieser nachgeschlagen) werden, um die entsprechende SessionFactory für den Benutzer.

Kurz gesagt, die Antwort ist die Konstruktion von SessionFactory Instanzen dynamisch für jede Verbindung/Datenbank und stellen Sie sicher, dass Ihre Datenzugriffsschicht weiß, wie sie die entsprechenden SessionFactory für die Kriterien.

1voto

Sebastien Lorber Punkte 83875

Ich stimme Matt B zu, aber sind Sie sicher, dass es eine gute Idee ist, so etwas zu tun?

Ich nehme an, Sie haben verschiedene Kunden und möchten die Daten jedes einzelnen in einer eigenen Datenbank speichern (oder so ähnlich). Warum speichern Sie nicht alle Kundendaten in derselben Datenbank und filtern diese Daten nach der Kundennummer?

1voto

Sebastien Lorber Punkte 83875

Ich habe vor einiger Zeit eine Diskussion in meinem Unternehmen verfolgt, bei der es um die Unterstützung von Federn für diese Aufgabe ging.

Einige Dinge, die Sie interessieren könnten: http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/ http://static.springsource.org/spring/docs/3.0.x/javadoc-api/index.html?org/springframework/aop/target/HotSwappableTargetSource.html

AbstractRoutingDataSource scheint für Ihren Fall interessant zu sein. Jemand sagte auch, dass dies vielleicht den 2. Hibernate-Cache deaktivieren, zu bestätigen...

1voto

Sebastien Lorber Punkte 83875

Ich komme ein wenig zu spät, aber wenn Sie planen, eine SAAS-Anwendung mit mehreren Mietverhältnissen zu erstellen, könnten Sie, wie Sie sagten, auch eine Trennung nach einem Schlüssel wie der Kunden-ID verwenden.

In Hibernate helfen Ihnen die Filter dabei...

Siehe: http://www.lunatech-research.com/archives/2011/03/04/play-framework-writing-multitenancy-application-hibernate-filters

Es ist ein Link für Play-Framework, aber es verwendet Hibernate, so dass Sie fast das gleiche mit klassischen Java EE Zeug tun könnte ...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X