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

15
我们的情况如下:
  • 我们在企业应用程序中使用(纯)JPA进行持久化。
  • 由于性能原因,我们在这里和那里使用了许多相当复杂的本地查询。
  • 访问数据库(Oracle 11g)时,我们使用一个数据库用户APP_ACCESS,该用户与表的“所有者”(APP_OWNER)不同。这是数据库管理的硬性要求。
  • 目前,模式名称(APP_OWNER)在本地查询中是硬编码的,如下所示:

"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 - 如何更改默认模式

进一步的问题:

如何从会话工厂以编程方式获取Hibernate默认模式名称?

请参见此答案,该答案建议使用{h-schema}。看起来很合适,但它是特定于Hibernate的。我们想保持“纯JPA”。另一个问题是我在Hibernate文档中找不到任何关于{h-schema}的提及,因此我们不能依赖此功能。

是否存在标准的JPA方法来设置默认数据库架构 - JPA实体和查询以及本地查询?

或者,如果我们能够在本地查询中使用某些“参数”或“设置”,那么这个问题也可以解决。


“原生查询”是直接在数据存储中执行的,与您的connectionURL相关。由调用它的人来确保任何“模式”使其SQL有效。JPA在此方面没有作用。 - Neil Stockton
@NeilStockton 由于JPA既具有“持久性单元的默认模式”的概念,又具有本地查询,因此我不会说它与JPA完全无关。 - lexicore
我说的是它不被本地查询使用,而不是“不被JPA使用”。 - Neil Stockton
2个回答

31

这是非常宝贵且非常有用的东西,用于绕过@Where - Matthias

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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接