2011-01-18 9 views
0

hibernateでは、session.getNamedQuery(QUERY_NAME)を実行すると、名前付きクエリが格納されているhbm.xmlファイルの名前を渡す必要はありません。 hbm.xmlの名前はcfgファイルに記述されています。hibernate named queries

名前付きクエリ用の5つのhbm.xmlファイルがあり、クエリ名(つまり、5つのファイルすべてで同じQUERY_NAME)に名前の競合がある場合、どのように休止状態が解決されるのでしょうか?

直感的に、session.getNamedQuery(QUERY_NAME)を実行する前に直感的に表示されます。クエリーが書き込まれる特定のhbm.xmlファイルを明示的にロードする必要があります。

答えて

1

Hibernateは、1つの論理的な名前空間の下にロードされたすべてのhbmファイルの名前付きクエリを集約します(名前はキーですが、put(..)の前にキーを重複してチェックする)。したがって、名前は、特定のセッションファクトリ全体で一意である必要があります。だから、すべての名前付きクエリが一意であることを確認してください。パンゲアの答えに加えて

+0

ありがとう。これはあなたの意見に直感的な機能ですか?つまり、Javaコードで名前付きの照会参照を見つけたら、それぞれのマッピングファイルをすべて確認する必要があります。 – Victor

+0

これは、フェイル・ファースト・バーチャリィを示します。これは、重複した名前が見つかった場合、hibernate cfgがスタートアップexをスローするときです。はい、これは直感的です –

0

:あなたは別の.hbm.xmlファイル内の同じクエリの異なるバージョンを持っており、それらの間で選択したい場合、あなたはそれだけで行うことができますが(SessionFactoryを構築する際にConfiguration.addFile()/Configuration.addInputStream()を呼び出すことによってそれを行うことができますSessionFactoryの初期化中に一度、その場で変更することはできません)。

0

これは直接質問には触れませんが、名前の衝突を避けるために扱うパッケージとエンティティを反映するクエリ名を与えるのが一般的です。 "findUser"の代わりに、 "com.myproject.domain.User.findByUsernameAndPassword"のようなものがあります。