【问题标题】:Hibernate bug using Oracle?使用 Oracle 的休眠错误?
【发布时间】:2010-03-05 10:49:23
【问题描述】:

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

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

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

那不是很优雅。

有人知道,我如何使用属性或通过操作 JDBC 连接字符串来配置模式?

我正在使用 Oracle 10g,10_2_3 补丁。

非常感谢。

【问题讨论】:

    标签: oracle hibernate orm


    【解决方案1】:

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

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

    例如

    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 连接部署应用程序四次。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        【讨论】:

          【解决方案4】:

          我创建了一个名为 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);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-14
            • 2014-03-27
            • 1970-01-01
            • 2019-11-05
            • 2011-05-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多