11

弊社の状況は以下の通りです。

  • エンタープライズ アプリケーションでの永続化には、(必ず純粋な) 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>

しかし、これはネイティブ クエリには当てはまらないと思います (現在テスト中です)。ここでのもう 1 つの問題は、orm.xml実際には構成用ではないということです。(ただし、Java コードでハードコーディングするよりも優れています)。

同様の答えを持つ別の投稿:

JPA - EclipseLink - デフォルトのスキーマを変更する方法

さらなる質問:

セッションファクトリからプログラムで休止状態のデフォルトスキーマ名を取得しますか?

の使用を提案するこの回答を参照してください{h-schema}。適切に見えますが、Hibernate 固有です。「純粋なJPA」にとどまりたいです。もう 1 つの問題は、Hibernate のドキュメントに {h-schema} に関する記述が見つからなかったことです。そのため、この機能に頼るのは安全ではありません。

JPAエンティティとクエリ、およびネイティブクエリなど、すべてのデフォルトデータベーススキーマを設定する標準的なJPAの方法はありますか?

あるいは、ネイティブ クエリの構成のどこかに設定された「パラメータ」または「設定」を使用できれば、これを解決できます。

4

2 に答える 2

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 に答える