java - 如何在纯 JPA 中为 native 查询配置默认数据库架构?

标签 java oracle hibernate jpa native-sql

我们的情况如下:

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

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

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

所以这是我的问题:

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

这是我目前发现的:

How to set up default schema name in JPA configuration?

特别是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>

但我认为这不适用于 native 查询(我们目前正在测试)。这里的另一个问题是 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”。另一个问题是我在 Hibernate 文档中找不到任何关于 {h-schema} 的提及,所以我们依赖这个特性是不安全的。

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

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

最佳答案

这个问题可能很老,但为了防止你仍然遇到这个问题而回答。您可以将 {h-schema} 用于 native 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/

关于java - 如何在纯 JPA 中为 native 查询配置默认数据库架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26885040/

相关文章:

java - GWT for 循环不是循环

oracle - 如何找到导致 ORA-00054 的原因?

java - volatile 变量未读取其更新值

java - 如何将一个对象添加到另一个对象的数组中java

sql - 为什么这个 Oracle 查询不起作用?

oracle - sqldeveloper 输出 count(*) 的正确结果,而 sqlplus 结果为零

oracle - 每组最大的行 - 进一步将结果集与左连接与 Hibernate 中的其他相关表相结合 - HQL。是否可以?

java - Grails - 创建数据库 View

java - 如何编写一个或多或少充当容器的应用程序?

java - 从 Spring-JMS 处理 JMS 消息的最快方法