11

我们的情况如下:

  • 我们在企业应用程序中使用(必须是纯的)JPA 来实现持久性。
  • 由于性能原因,我们在这里和那里使用了许多相当复杂的本机查询。
  • 在访问数据库(Oracle 11g)时,我们使用APP_ACCESS不同于表“所有者”的数据库用户(APP_OWNER)。这是来自数据库管理的硬性要求。
  • 目前,模式名称 ( APP_OWNER) 被硬编码到本机查询中,a-la:

"SELECT * FROM " + DatabaseSchemaConstants.SCHEMA_NAME + ".LOCATION"

不用说,我们对这种硬编码并不特别满意,因为“所有者”用户名的更改将意味着代码的更改——这绝对不利于维护。

所以这是我的问题:

我们如何为纯 JPA 中的本机查询配置默认数据库模式?

这是我到目前为止发现的:

如何在 JPA 配置中设置默认模式名称?

具体来说,这个答案提出了持久性单元和orm.xml文件的组合:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
                 version="1.0">
 <persistence-unit-metadata>

  <persistence-unit-defaults>
   <schema>myschema</schema>
  </persistence-unit-defaults>
 </persistence-unit-metadata>
</entity-mappings>

但我认为这不适用于本机查询(我们目前正在测试它)。这里的另一个问题是这orm.xml并不是真正的配置。(但它仍然比 Java 代码中的硬编码好)。

另一个类似答案的帖子:

JPA - EclipseLink - 如何更改默认模式

另一个问题:

从会话工厂以编程方式获取休眠默认模式名称?

请参阅这个建议使用的答案{h-schema}。看起来很合适,但它是特定于 Hibernate 的。我们想继续使用“纯 JPA”。另一个问题是我在 Hibernate 文档中找不到任何提及 {h-schema} 的地方,所以我们依赖这个特性是不安全的。

是否有标准的 JPA 方法来为所有内容设置默认数据库模式 - JPA 实体和查询以及本机查询

或者,如果我们能够在本地查询的配置中使用某些“参数”或“设置”设置,则可以解决此问题。

4

2 回答 2

21

这个问题可能很老,但回答以防万一你仍然遇到这个问题。您可以{h-schema}用于本机 SQL 查询(已针对 Hibernate v4 验证)。这是由hibernate.default_schema配置属性定义的。

例子:

"SELECT * FROM {h-schema}LOCATION"

参考: https ://vladmihalcea.com/how-to-resolve-the-hibernate-global-database-schema-and-catalog-for-native-sql-queries/

于 2017-09-25T03:54:20.337 回答
2

最后,经过几次内部讨论,我们决定在数据库级别解决这个问题。具体来说,使用after logon触发器:

CREATE OR REPLACE TRIGGER db_logon AFTER logon ON DATABASE
WHEN
(
  USER = 'APP_ACCESS'
)
BEGIN
  EXECUTE immediate 'ALTER SESSION SET CURRENT_SCHEMA = APP_OWNER';
END;
于 2014-11-14T08:50:30.033 回答