2010-03-05 77 views
0

我遇到了这个问题,我使用了persistence.xml中的一个属性,它迫使Hibernate只查看给定模式中的表。使用Oracle的Hibernate bug?

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

因为我们现在使用4种不同模式的实际解决方案是产生一个修改persistence.xml 4个war文件。

这不是很优雅。

有谁知道,我怎样才能配置架构的属性或通过操纵JDBC连接字符串?

我正在使用Oracle 10g,10_2_3修补程序。

非常感谢。

+4

和bug是... 。? – skaffman 2010-03-05 10:53:04

回答

1

您可以在oracle数据库上为四个不同的应用程序创建四个不同的用户,JDBC连接将包括用户。

对于用户,您可以为表创建同义词和权限。

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; 

而当您从休眠状态访问表时,将模式关闭。以USER1身份登录时,它将使用SCHEMA1等。

这样,您不必使用四个不同的persistence.xml文件创建四个不同的WAR文件。只需用不同的jdbc连接部署应用程序四次。

希望有所帮助。

+0

+1你应该在Oracle空间解决这个问题 – 2010-03-05 19:27:09

1

如果你不想产生四种不同的WAR然后把这个属性在hibernate.properties文件,并把该文件的类路径上(但 web应用程序)的每个Web应用程序。

0

我创建了一个名为deduceSchema的方法,我在设置SessionFactory时运行该方法。它使用数据源打开一个jdbc连接(因为您还没有Hibernate会话)并查询“从dual选择用户”以获取登录用户。如果您登录的用户也拥有这些表,这将是准确的。如果不是,我使用jndi环境变量来覆盖。

一旦我有模式,我修改了Hibernate的配置来设置它为每个表,虽然这仅仅是必要的,如果登录的用户是比模式不同:

for (Iterator iter = configuration.getTableMappings(); iter.hasNext();) { 
    Table table = (Table) iter.next(); 
    table.setSchema(schema); 
} 
相关问题