2010-03-05 6 views
0

J'ai le problème, que j'utilise une propriété dans le persistence.xml qui oblige Hibernate à rechercher uniquement des tables dans le schéma donné.Hibernate bug en utilisant Oracle?

<property name="hibernate.default_schema" value="FOO"/> 

Parce que nous utilisons maintenant 4 différents schémas, la solution réelle est de générer 4 fichiers de guerre avec un persistence.xml modifié.

Ce n'est pas très élégant.

Est-ce que quelqu'un sait, comment je peux configurer le schéma avec une propriété ou en manipulant la chaîne de connexion JDBC? J'utilise Oracle 10g, Patch 10_2_3.

Merci beaucoup.

+4

et le bug est ... ? – skaffman

Répondre

1

Vous pouvez créer quatre utilisateurs différents sur la base de données Oracle pour les quatre applications différentes, la connexion JDBC inclurait l'utilisateur.

Pour l'utilisateur, vous pouvez créer des synonymes et des autorisations pour les tables.

E.g.

create or replace synonym USER1.tablename FOR SCHEMA1.tablename; 
create or replace synonym USER2.tablename FOR SCHEMA1.tablename; 
create or replace synonym USER3.tablename FOR SCHEMA2.tablename; 

Et lorsque vous accédez aux tables de mise en veille prolongée, il suffit de laisser le schéma off. Une fois connecté en tant que USER1, il utilisera SCHEMA1, etc.

De cette façon, vous n'avez pas besoin de créer quatre fichiers WAR différents avec quatre fichiers persistence.xml différents. Il suffit de déployer l'application quatre fois avec différentes connexions jdbc.

Espérons que ça aide.

+0

+1 vous devriez résoudre cela dans l'espace Oracle si vous le pouvez –

1

Si vous ne souhaitez pas générer quatre WARs différents mettre ensuite cette propriété dans un fichier hibernate.properties et de mettre ce fichier sur le chemin de la classe (mais en dehors la webapp) pour chaque webapp .

0

J'ai créé une méthode appelée deduceSchema que je cours lorsque je configure la SessionFactory. Il ouvre une connexion jdbc en utilisant la source de données (parce que vous n'avez pas encore de session Hibernate) et interroge "select user from dual" pour obtenir l'utilisateur connecté. Ce sera précis si l'utilisateur que vous connectez comme possède également les tables. Sinon, j'utilise une variable d'environnement jndi pour remplacer.

Une fois que je le schéma, je modifier la configuration Hibernate pour le définir pour chaque table même si cela est nécessaire que si l'utilisateur connecté est différent du schéma:

for (Iterator iter = configuration.getTableMappings(); iter.hasNext();) { 
    Table table = (Table) iter.next(); 
    table.setSchema(schema); 
} 
Questions connexes