1

hibernate(3.6.9.Final) と oracle 11g データベースを jdbc(ojdbc6:oracle.jdbc.OracleDriver) で使用しています。私の接続文字列は jdbc:oracle:thin:@SERVERNAME:1521:ORCL datasource: com.mchange.v2 です。 .c3p0.ComboPooledDataSource

ioc:春 3.0.7.RELEASE

サーバー: トムキャット 6

私の問題の説明は次のとおりです。Oracle サーバー MY_SC と MY_OLD_SC で 2 つのスキーマ (ユーザー) が定義されています。 MY_TABLE がありますが、MY_ID 列に加えて MY_NAME 列もあります

MY_SC ユーザーでアプリケーションを起動し、検証時に休止状態にすると、次の例外で失敗します。

org.hibernate.HibernateException: 行がありません: MY_OLD_SC.MY_TABLE の MY_NAME

MY_SC ユーザーと接続していることを確認したにもかかわらず、間違ったスキーマに接続しているようです。データベースから MY_OLD_SC を削除した後でのみ、MY_SC に接続できます。

この問題は一貫しておらず、さまざまな詐欺で作業できる場合もありますが、一度失敗すると、使用したいものを除いてデータベース内のすべてのスキーマを削除する必要があります。ほとんどの場合、新しいスキーマの impdp を使用した後に発生しますが、impdp の後だけではありません

私がSQL開発者に接続すると、ユーザーへの接続が正しいように見えることに注意してください。

ユーザーを作成するためのステートメント:

CREATE USER username IDENTIFIED BY username
       DEFAULT TABLESPACE USERS  
       TEMPORARY TABLESPACE temp
       QUOTA UNLIMITED ON USERS;


GRANT conn TO username;

impdb のコード:

./impdp system/pass@orcl remap_schema=org_name:new_name directory=DATA_PUMP_DIR TRANSFORM=oid:n dumpfile=backup.dmp

何が問題なのかがわかれば素晴らしいと思いますが、おそらくユーザーを別の方法で作成する必要がありますか? この問題の原因は何ですか?

よろしくお願いします

4

3 に答える 3

1

最近、Hibernate 3.3.0 でこの問題が発生しました。基本的に、検証中に実行される Hibernate データベース メタデータ スキャナーは、テーブル定義への読み取りアクセス権を持っている限り (必ずしもテーブル自体への読み取りアクセス権があるとは限りません)、エンティティの定義に一致するテーブルを取得します。それらはアルファベット順に取得されるため、エンティティがテーブル用WIDGETであり、ターゲット スキーマがMY_APP_SCHEMAに別のWIDGETものがある場合、エンティティを検証するために Hibernate によって 1 つが使用されますANOTHER_APPS_SCHEMAANOTHER_APPS_SCHEMA

Hibernate のサイトで公式なものを見つけることができませんでしたが、同様の投稿をここここで見つけました。

hibernate.default_schemaHibernate が使用するスキーマを設定するために使用できる場合があります。

于 2014-02-09T22:43:24.507 に答える
0

解決策の 1 つは、ユーザーに合わせてhibernate.default_schemaプロパティを設定することです(永続化ユニットで、または TomaszZ が指摘したように env プロパティとして)。

他の解決策は、ユーザーの他のスキーマにアクセスする権限を取り消すことです。これは、重大なセキュリティ問題のためにも許可されるべきではありません (そのようなアクセスがその特定のユーザーに必要な場合を除きます)。

于 2015-10-09T13:31:53.087 に答える