2009-08-19 12 views
23

Ich habe ein paar Probleme mit einem bestimmten Problem mit JPA/Spring:JPA mit mehreren Datenbankschemas

Wie kann ich dynamisch ein Schema zu einer Entität zuweisen?

Wir haben TABLE1, die zu Schema AD und TABLE2 gehört, die unter BD ist.

@Entity 
@Table(name = "TABLE1", schema="S1D") 
... 

@Entity 
@Table(name = "TABLE2", schema="S2D") 
... 

Die Schemata, wie sie auf die Umwelt (Dev/Acc/PRD) hängt möglicherweise nicht in einer Anmerkung Attribut fest einprogrammiert werden. (In der Annahme sind die Schemas S1A und S2A)

Wie kann ich das erreichen? Ist es möglich, eine Art Platzhalter wie folgt angeben:

@Entity 
@Table(name = "TABLE1", schema="${schema1}") 
... 

@Entity 
@Table(name = "TABLE2", schema="${schema2}") 
... 

so dass Schemata auf der Basis einer Eigenschaftendatei ersetzt werden in der Umgebung wohnen?

Prost

Antwort

8

Ich hatte das gleiche Problem, das ich, dass mit einem persistence.xml gelöst, in dem ich zu den benötigten orm.xml Dateien innerhalb verweise ich erklärte die db shema

<persistence 
xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
version="2.0" > 
<persistence-unit name="schemaOne"> 
    . . . 
    <mapping-file>ormOne.xml</mapping-file> 
    . . . 
</persistence-unit> 

<persistence-unit name="schemaTwo"> 
    . . . 
    <mapping-file>ormTwo.xml</mapping-file> 
    . . . 
</persistence-unit> 
</persistence> 

jetzt Sie eine EntityManagerFactory für Ihre speziellen erstellen Schema

EntityManagerFactory emf=Persistence.createEntityManagerFactory("schemaOne"); 
+0

was ist, wenn es eine Beziehung zwischen Ormone und OrmTwo ist? –

2

Eine Sache, die Sie, wenn Sie bei der Bereitstellung wissen tun können, ist 2 orm.xml Dateien zu haben. Eine für schema1 und eine für schema2 und dann in der persistence.xml haben Sie 2 Persistenzeinheiten definiert. Das Setzen von Annotationen ist ein Anti-Pattern, wenn Sie Dinge wie das Schema ändern müssen

0

Annotationsargumente müssen endgültig sein und können daher zur Laufzeit nicht geändert werden.

N

1

Sie könnten zwei Datasource Erklärungen haben (eine für jedes Schema) in Ihrem context.xml und definieren zwei Persistenzeinheiten dieses Datenquellen verwenden. Die context.xml kann dann in den verschiedenen Umgebungen unterschiedlich sein.

2

Versuchen folgende:

puplic class MyClass { 
    public static final String S1D="S1D"; 
    public static final String S2D="S2D"; 
} 

@Entity 
@Table(name = "TABLE1", schema=MyClass.S1D) 
... 

@Entity 
@Table(name = "TABLE2", schema=MyClass.S2D) 
... 
Verwandte Themen