8

カスタム命名戦略 (テーブル名のみ) を実装する方法を調査しているときに、解決できない矛盾に遭遇しました。(JBoss 6.1.0.Final で hibernate-core 3.6.6.Final を使用しています。PostgreSQL 9.1.9 で)

には 3 つの組み込み実装があるようですNamingStrategy

  1. DefaultNamingStrategy
  2. EJB3NamingStrategy
  3. ImprovedNamingStrategy

デフォルトは in に設定されているようEJB3NamingStrategyですorg.hibernate.cfg.Configuration

ただし、テーブル名は、上記のいずれにも一致しない戦略に従って設定されているようです。

例:
クラス名:package.ClassName
結果のテーブル名:classname

StringHelper.unqualify( className )戦略 1 と 2 は単にすべてのパッケージ名とドットを削除するだけの呼び出しなので、結果はClassName.

戦略 3 では、すべてのパッケージ名とドットを削除し、キャメルケース文字の前にアンダースコアを置き、最後に小文字に変換しclass_nameます。

(hibernate 4.1.0.Final のソース コードは、これらのクラスで変更されていないようです。)

誰かがこれを明確にするのを手伝ってくれますか?

4

1 に答える 1

4

非常に簡単!おもちゃの環境を作成するのに時間を費やしたくないので、作業中のアプリケーションhibernate-core 3.6.6.Finalで正確に使用されているインスタンスを確認する方法を説明します。

ホストにインストールvisualvmします。ローカル アプリケーションのヒープ ダンプを作成できます。削除サーバーでヒープ ダンプを作成するには - サーバーで実行します。

jmap -dump:format=b,file=heap.dump $PID

ダンプを開き、visualvmOQL クエリを実行します。

map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator")

それがあなたの命名戦略です。「インスタンス」タブを使用して参照階層全体をナビゲートし、他の実際のタイプhbmまたはjpaNamingStrategy が使用されていることを知ることができます。

Hibernate のバージョンが異なれば、宣言されたフィールドと型も異なります。フィールドがない場合はnamingStrategyDelegator、インスタンスを掘り下げてみてください:

heap.objects('org.hibernate.cfg.Configuration')

そのクラスが Hibernate のバージョンに含まれていない場合は、ドキュメントとソースを読んで適切なクラスを見つけてください。

依存関係があるorg.hibernate:hibernate-entitymanager:jar:4.3.11.Final場合:

map(heap.objects('org.hibernate.cfg.Configuration'), "it.namingStrategyDelegator")
      == org.hibernate.cfg.naming.LegacyNamingStrategyDelegator

そしてそれは内部的に使用します:

LegacyHbmNamingStrategyDelegate
LegacyJpaNamingStrategyDelegate

JPAアノテーションの提示に応じて。いずれにせよ、このインスタンスは のインスタンスLegacyNamingStrategyDelegatorを持つフィールドを持つ (そう、循環参照!) を参照namingStrategyしますorg.hibernate.cfg.EJB3NamingStrategy

それだけです!wepapp でデフォルトの命名戦略の実装を見つけるのに 1 分を費やし、この投稿を書くのに 5 分を費やしています ((

見てくれてありがとう、ハッピーハッキング!

于 2015-12-25T15:32:15.563 に答える