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

时间:2014-11-12 10:46:05

标签: java oracle hibernate jpa native-sql

我们的情况如下:

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

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

毋庸置疑,我们对这种硬编码并不特别高兴,因为"所有者"用户名将意味着代码中的更改 - 这绝对不利于维护。

所以这是我的问题:

我们如何在纯JPA中为本机查询配置默认数据库架构?

这是我迄今为止所发现的:

  

How to set up default schema name in JPA configuration?

Specificaly this answer提出了持久性单元和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 - How to change default schema

另一个问题:

  

getting hibernate default schema name programmatically from session factory?

请参阅this answer,建议使用{h-schema}。看起来很合适,但它是特定于Hibernate的。我们希望继续使用纯粹的JPA&#34;。另一个问题是我在Hibernate文档中找不到{h-schema}的任何提及,因此我们依赖此功能是不安全的。

是否有标准的JPA方式为所有内容设置默认数据库架构 - JPA引用和查询以及本机查询

如果我们能够使用一些&#34;参数&#34;或者可以解决这个问题。或&#34;设置&#34;在我们的原生查询中设置配置。

2 个答案:

答案 0 :(得分:9)

这个问题可能已经过时了,但请回答以防您遇到此问题。您可以使用{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/

答案 1 :(得分:0)

最后,经过一些内部讨论后,我们决定在数据库级别上解决这个问题。具体而言,使用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;