まず、私は Hibernate の専門家ではありません。私は他のプロジェクトでその基本のみを使用しました。しかし今、レガシー データベース スキームで Hibernate を使用したいのですが、テーブルを Java ドメイン モデルにマップする際にいくつかの問題が発生しています。
1) 多くのテーブルには、ユーザーが割り当てた主キー (文字列として) があります。したがって、それらは何らかのアルゴリズムに従って生成されません。実際、それらは Hibernate が「自然な」キーと呼ぶものです。ユーザーによって割り当てられた ID を受け入れるように Hibernate に指示する方法はありますか?
2) 2 番目の問題は、多くのテーブルに、valid_from、valid_to、date_created、date_last_modified、user_last_modified、user_created などの共通のプロパティがあることです。これらのプロパティは、監査 (どのレコードがどのユーザーによって変更されたか) に使用され、'valid_to' 日付フィールドが過去の場合にレコードを無効にします。これらのフィールドは「メタデータ」のように見えるため、エンド ユーザーに公開したくありませんが、これらのフィールドを更新する方法を見つける必要があります。レコードが変更されるたびにこれらのフィールドを更新するために使用できる Hibernate の一般的なソリューションはありますか? 参考までに、これらのフィールドは、2 つのテーブル間の多対多の関係を管理するために使用される「リンク テーブル」でも使用されます。
すべてのヘルプは非常に高く評価されています!
更新: AbstractEntity を使用して共通のプロパティを保持し、EventListener を使用してこれらのフィールドを挿入/更新します。ユーザーは UserContext.getCurrentUser() によって取得されます (ユーザーは ThreadLocal を使用して現在のスレッドにバインドされます)。
現在の唯一の問題は、これらの「関連付け」テーブルを処理する方法です...それらにはこれらの共通フィールドも含まれており、そのような関連付けテーブルをマップする別のクラスを作成したくありません。私の意見では、Hibernate はこのようなリンク テーブルを隠すのに優れています。このようなリンク テーブルを EventListener で更新する方法はありますか?
たとえば、テーブル A がリンク テーブル A_B を介してクラス B と多対多の関係を持っている場合、A または B でレコードが挿入/更新されるたびに A_B を更新する方法はありますか?