2009-08-19 22 views
23

Ho un po 'di problemi con un problema particolare utilizzando JPA/Spring:JPA che utilizza più schemi di database

Come posso assegnare dinamicamente uno schema a un'entità?

Abbiamo TABLE1 che appartiene allo schema AD e TABLE2 che è in BD.

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

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

Gli schemi potrebbe non essere codificato in un attributo nota in quanto dipende dall'ambiente (Dev/Acc/Prd). (In accettazione gli schemi sono S1A e S2A)

Come posso ottenere questo risultato? E 'possibile indicare una sorta di segnaposto in questo modo:

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

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

in modo che gli schemi vengono sostituiti sulla base di un file di proprietà che risiede nell'ambiente?

Acclamazioni

risposta

8

Ho avuto lo stesso problema che ho risolto che con un persistence.xml in cui mi riferisco ai file necessari all'interno orm.xml ho dichiarato lo Shema db

<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> 

ora è possibile creare un EntityManagerFactory per il vostro speciale schema

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

che dire se ci sia una relazione tra Ormone e OrmTwo? –

2

Una cosa si può fare se si conosce la distribuzione è di avere 2 file orm.xml. Uno per schema1 e uno per schema2 e quindi in persistence.xml sono definite 2 unità di persistenza. L'inserimento di annotazioni è un anti-modello se è necessario modificare elementi come lo schema

0

Gli argomenti di annotazione devono essere definitivi e non possono quindi essere modificati in fase di runtime.

N

1

Si potrebbe avere due dichiarazioni DataSource (uno per ogni schema) nel vostro context.xml e definire due unità di persistenza utilizzando questo origini dati. Il context.xml può quindi essere diverso sui server delle applicazioni dei diversi ambienti.

2

Prova seguente:

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) 
... 
Problemi correlati