我遇到了问题,我在persistence.xml
中使用了一个属性,它强制Hibernate只查找给定模式中的表。
<property name="hibernate.default_schema" value="FOO"/>
因为我们现在使用4种不同的模式,实际的解决方案是使用修改后的persistence.xml
生成4个war文件。
那不是很优雅。
有谁知道,如何使用属性配置架构或通过操纵JDBC连接字符串?
我正在使用Oracle 10g,10_2_3 Patch。
非常感谢。
答案 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);
}