2

大規模なエンタープライズデータベーススキーマをマップする必要があります。多くのレガシーアプリケーションがそのスキーマに依存しているため、複合キーから代理キーに変更できません(データベースオブジェクトの約70%に対してトリガーの代わりにビューを使用する場合を除く)。これにより、多くの問題が発生しました。克服する方法がわからない。

  1. サロゲート(プライマリ、自動インクリメント)キーと、多数のテーブルがサロゲートキーに対して多対1の関係を形成する複合一意キー、および同時に多数のレガシーテーブルを持つテーブルをマップする方法ユニークなコンポジットに関連しますか?
  2. 複合キー上の複数の関係が同じコンポーネントを共有する場合はどうすればよいですか(Naselja:Korisnik / Opcina、Korisnik / Grad)?Hibernateは、@JoinColumnアノテーションに「updatable=false、insertable = false」を追加しない限り、同じ列(Korisnik)を2回使用することはできないと言っています。しかし、それを行うと、リレーションのすべてのコンポーネントが挿入可能と更新可能の同じ設定を持っている必要があるというメッセージが表示されます。次に、2番目のリレーションを更新または挿入するにはどうすればよいですか?
  3. 'Ulice'テーブルに行を挿入すると、エラー "org.hibernate.AnnotationException:lc.data.hibernate.Ulice.naseljaのreferencedColumnNames(Korisnik、Naselje)が単一のプロパティにマップされていないlc.data.hibernate.Naseljaを参照しています"'Naselja'テーブルにない限り、モデルの'Korisnici'テーブルに多対1の関係を明示的に追加します。これは実際のデータベーススキーマを反映していません。

私がこれまで読んだことから、JPAは非主キーとの関係をサポートしていませんが、人々はそれをサポートしています。また、私の2番目の問題はHibernate 5で解決される可能性がありますが、ここでどのルートを取るべきかについての良いアドバイスを期待しています。

テストモデル、データベーススクリプト、およびプロジェクト:


データベーススキーマMSSQL

MSSQLはデータベーススクリプトを作成します

JavaNetBeansサンプルプロジェクト

4

1 に答える 1

2

1)-自動インクリメント列を主キーとしてマップします-compositeidのクラスを作成し、property-refを使用して多対1をマップします

    <component name="compIdProperty" unique="true">
      <property column="naselje" />
      <many-to-one column="korisnik" class="Korisnik"/>
    </component>

    <many-to-one name="Naselja" property-ref="compIdProperty">
      <column name="naselje" />
      <column name="korisnik" />
    </many-to-one>

2)AFAIKHibernateを使用することはまったく不可能です

私が見る唯一の可能な方法は、プロパティとして(Grad、Opcina)をマップし、自分で関連付けを管理することです

3)これはレガシースキーマであるため、多対1を追加するという妥協案を提示し、OpcineとGradoviのKorisnikに多対1をマッピングします。

于 2012-05-14T12:24:49.083 に答える