web-dev-qa-db-fra.com

JPA utilisant plusieurs schémas de base de données

J'ai un peu de mal avec un problème particulier avec JPA/Spring:

Comment puis-je affecter dynamiquement un schéma à une entité?

Nous avons TABLE1 qui appartient au schéma AD et TABLE2 qui est sous BD.

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

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

Les schémas peuvent ne pas être codés en dur dans un attribut d'annotation car cela dépend de l'environnement (Dev/Acc/Prd). (En acceptation, les schémas sont S1A et S2A)

Comment puis-je atteindre cet objectif? Est-il possible de spécifier une sorte d'espace réservé comme ceci:

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

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

afin que les schémas soient remplacés en fonction d'un fichier de propriétés résidant dans l'environnement?

À votre santé

25
javacoder

J'ai eu le même problème que j'ai résolu avec un persistence.xml dans lequel je me réfère aux fichiers orm.xml nécessaires dans j'ai déclaré le 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>

vous pouvez maintenant créer une EntityManagerFactory pour votre schéma spécial

EntityManagerFactory emf = Persistence.createEntityManagerFactory("schemaOne");
10
carmen_munich

Une chose que vous pouvez faire si vous savez au déploiement est d'avoir 2 fichiers orm.xml. Un pour schema1 et un pour schema2, puis dans le persistence.xml, vous avez défini 2 unités de persistance. Mettre des annotations est un anti-modèle si vous avez besoin de changer des choses comme le schéma

2
DataNucleus

Essayez de suivre:

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)
...
2
user3092746

lorsque vous créez une source de données, vous pouvez peut-être initialiser la connexion pour utiliser un schéma différent

par exemple. pour weblogic

Spécifiez le schéma par défaut pour le pool JDBC dans weblogic/Oracle

1
Kalpesh Soni

Vous pouvez avoir deux déclarations DataSource (une pour chaque schéma) dans votre context.xml et définir deux unités de persistance à l'aide de ces sources de données. Le context.xml peut alors être différent sur les serveurs d'applications des différents environnements.

1
Dominik

Les arguments d'annotation doivent être définitifs et ne peuvent donc pas être modifiés au moment de l'exécution.

0
Nico