2

Oracle スキーマに永続化されたエンティティがあります。DB 挿入時に、トリガーは DB シーケンスを使用してエンティティ ID を生成します。レガシー コンポーネントにとって重要な ID 生成シーケンス (ログ テーブルの種類) の横にある別のテーブルも更新されるため、トリガーの使用は必須です。

エンティティ マッピングで Hibernate id ジェネレーターを構成するにはどうすればよいですか?

同様の Stackoverflow の質問を調べてみると、私の場合には当てはまらない解決策がいくつか見つかりました。

  1. シーケンスを直接使用する: <generator class="sequence">...</generator>. 残りのトリガー コードが実行されないため、これは不可能です。
  2. これ<generator class="select">...</generator>は、挿入後に Hibernate が別の固有のプロパティを使用してエンティティを選択することを意味します (Hibernate-3.3 マニュアル 5.1.4.6. に従って)。他に一意の列がなく、一連のプロパティの使用がサポートされていないため、これもここでは不可能です。
  3. <generator class="assigned">...</generator>を呼び出す前に偽の IDを使用および設定するsave()。この ID は DB トリガーによって無視され、結果の DB 行には正しい ID が含まれます。ただし、私の Java インスタンスにはそれがなく、このソリューションはトリガーの実装を前提としているため、魅力的ではありません。

この問題の良い解決策はありますか?

4

2 に答える 2

0

<generator class="select">より正しい解決策です。自動生成された値を元に戻すことができないという事実は、ypu モデルとジェネレーター IMHO の選択に問題があることを示しています。を使用してみることができますが<generator class="sequence-identity">、javadocs (org.hibernate.id.SequenceIdentityGenerator()) で述べたように、私の経験では、Oracle ドライバーでの getGeneratedKeys のサポートはかなりむらがあるか、少なくとも数年前に私が最初に開発し、そのジェネレーターをテストしました。

于 2012-07-09T14:39:32.840 に答える
0

ID の生成と他のテーブルの更新は別のタスクにする必要があります。シーケンスを直接使用して、「他のテーブルを更新する」コードのみをトリガーに残すことができます。

これができない特定の理由はありますか?

于 2012-07-09T12:56:07.387 に答える