2012-04-03 2 views
1

Ich bin neu bei JPA und JBoss, so im Vorhinein, wenn das eine dumme Frage ist.Ändern Sie JPA-Schema zur Laufzeit mit EclipseLink auf JBoss

Ich habe Anwendung läuft auf JBoss mit EclipseLink, die Elemente aus verschiedenen Datenbanken auf der Grundlage einer JPQL-Zeichenfolge abgerufen. Dies funktioniert großartig, außer dass eine Datenbank mehrere Schemas enthält. Ich möchte in der Lage sein, zu bestimmen, welches Schema zur Laufzeit verwendet werden soll, und alle Entitäten auszuwählen, die zu diesem Schema gehören, ohne die JPQL-Zeichenfolge zu ändern.

Um die Dinge noch komplizierter zu machen, möchte ich auch in der gleichen Abfrage über Schemata verbinden. In diesem Fall könnte sich die JPQL-Abfrage ändern oder es könnten Parameter festgelegt werden, die jedes Entitätsschema angeben.

Nach einiger Suche stieß ich auf diesem:

JPA: How do I specify the table name corresponding to a class at runtime?

, die eine Lösung mit ASM hat, den die Tabelle Anmerkung dynamisch modifiziert. Ich habe versucht, dies zu verwenden, um die Schemaeigenschaft der Tabellenanmerkung zu ändern, aber für das Leben von mir kann ich es nicht zum Funktionieren bringen; Es scheint, dass Eclipse Link einen anderen Klassenlader verwendet, um die Entity-Klassen zu initialisieren, auf die ich nicht weiß, wie ich darauf zugreifen soll, und somit hat das Ändern der Annotation keine Auswirkungen.

Eine andere Lösung sind mehrere XML-Konfigurationsdateien für jedes Schema. Es scheint unelegant; Wenn ich eine neue Entität hinzufüge, muss ich daran denken, sie der XML-Datei jedes Schemas hinzuzufügen. Ich weiß auch nicht, wie ich das über mehrere Schemas hinweg machen kann.

Gibt es eine Möglichkeit, dieses Problem zu lösen? Fehle ich etwas oder treibt dies JPA über das hinaus, wofür es gedacht war?

Antwort

3

Sie sollten eine andere Persistenzeinheit pro Schema haben. Sie können dieselben Klassen/Zuordnungen verwenden, Sie benötigen lediglich eine Datei namens orm.xml, die das andere Standardschema definiert. Die Datei benötigt nichts anderes. Sie können Ihre Objekte dennoch in Annotationen oder in einer separaten Datei "orm.xml" zuordnen.

Um eine Persistenzeinheit mit einigen Objekten in einem Schema und andere in einem Schema zu haben, können Sie dies wiederum in einer Datei "orm.xml" tun. Sie müssen nur die Entitäten einschließen, die das nicht standardmäßige Schema in der Datei orm.xml verwenden. EclipseLink führt immer Anmerkungen und XML zusammen, so dass Sie beide verwenden können und nur die Zusätze haben, die Sie in XML benötigen.

Mit EclipseLink können Sie auch einen tableQualifier definieren, der das Standardschema definiert. Dies kann mit einem SessionCutsomizer beim Login der Sitzung eingestellt werden.

+0

Das bedeutet, ich muss eine neue Datei "orm.xml" in einer neuen Persistenzeinheit für jede eindeutige Kombination von Schemata definieren, richtig? Ich hatte gehofft, das zu vermeiden, da es zu vielen Persistenzeinheiten und zu orm.xml-Dateien führen wird. – user1309663

+1

Ist es möglich, entweder einen Verweis auf den aktuellen Sitzungs-Customizer zu erhalten oder das Tabellenqualifikationsmerkmal zur Laufzeit zu ändern? Etwas wie: 'DatabaseLogin login = server.getLogin();' 'login.setTableQualifier (" MySchem ");' 'session = server.acquireClientSession (login);' Dies funktioniert leider nicht. – user1309663

+0

Änderung der Freigabe Konfiguration in einem gleichzeitigen/geteilten System ist nie eine gute Idee. Wenn Sie einen anderen Datenbankbenutzer haben, der standardmäßig auf jedes andere Schema verweist, müssen Sie nur den Benutzernamen in den PU-Eigenschaften übergeben, wenn Sie eine EMF erstellen. – James