使用Oracle的Hibernate错误?

时间:2010-03-05 10:49:24

标签: oracle hibernate orm

我遇到了问题,我在persistence.xml中使用了一个属性,它强制Hibernate只查找给定模式中的表。

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

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

那不是很优雅。

有谁知道,如何使用属性配置架构或通过操纵JDBC连接字符串?

我正在使用Oracle 10g,10_2_3 Patch。

非常感谢。

4 个答案:

答案 0 :(得分: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连接部署应用程序四次。

希望有所帮助。

答案 1 :(得分:1)

如果您不想生成四个不同的WAR,请将此属性放在hibernate.properties文件中,并将该文件放在类路径上(但 webapp之外)为每个webapp

答案 2 :(得分:0)

请参阅此内容 - https://www.hibernate.org/429.html

答案 3 :(得分:0)

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

一旦我有了架构,我就修改了Hibernate配置来为每个表设置它,尽管只有当登录用户与架构不同时才需要这样做:

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