我们的情况如下:
APP_ACCESS
与"所有者"不同。表(APP_OWNER
)。这是数据库管理的一项硬性要求。APP_OWNER
)已硬编码到本机查询中,a-la: "SELECT * FROM " + DatabaseSchemaConstants.SCHEMA_NAME + ".LOCATION"
毋庸置疑,我们对这种硬编码并不特别高兴,因为"所有者"用户名将意味着代码中的更改 - 这绝对不利于维护。
所以这是我的问题:
我们如何在纯JPA中为本机查询配置默认数据库架构?
这是我迄今为止所发现的:
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代码中的硬编码好。)
另一篇帖子有类似答案:
另一个问题:
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;在我们的原生查询中设置配置。
答案 0 :(得分:9)
这个问题可能已经过时了,但请回答以防您遇到此问题。您可以使用{h-schema}
进行本机SQL查询(已针对Hibernate v4进行了验证)。这由hibernate.default_schema
配置属性定义。
示例:强>
"SELECT * FROM {h-schema}LOCATION"
答案 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;