7

シーケンス (Oracle データベース) を使用するトリガーによってインデックスが自動入力されたテーブルがあります。

CREATE TABLE A
(
  IDS                           NUMBER(10)      NOT NULL
)


CREATE OR REPLACE TRIGGER A_TRG
BEFORE INSERT
ON A REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
BEGIN
  :new.IDS := A_SEQ.nextval;
END A_TRG;
/

一致する Java クラスがあります。

Class A {
   @Id
   @SequenceGenerator(name = "aSequence", sequenceName = "A_SEQ", allocationSize = 1)
   @GeneratedValue(generator = "aSequence", strategy = GenerationType.SEQUENCE)
   @Column(name = "IDS")
   Long id;

   ...
}

次のように A のインスタンスを永続化しようとすると:

EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
A a = new A();
Long id = getHibernateTemplate().save(a);
transaction.commit();

私はこの問題を抱えています:

  • 保存呼び出しによって返されるコード内の ID = "X"

  • データベース内の ID = "X+1"

データベーストリガーが ID を作成できるように Hibernate をセットアップする方法はありますか?

ありがとう

4

2 に答える 2

13

シーケンスからIDを生成するためのOracleトリガーのHIbernateの問題で見つかった応答

ID が指定されていない場合にのみトリガーを実行するように調整する必要があります。

CREATE OR REPLACE TRIGGER A_TRG
BEFORE INSERT
ON A REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
WHEN (New.IDS is null) -- (1)
BEGIN
  :new.IDS := A_SEQ.nextval;
END A_TRG;
/

(1) この行により、Hibernate は手動で A_SEQ.nextVal を呼び出して ID を設定し、トリガーをバイパスできます。そうしないと、トリガーは常に nextval を呼び出して ID をリセットするため、Hibernate は無駄に nextval を取得します。

于 2012-11-20T10:23:14.830 に答える
1

あなたのクラスBでは、あなたが持っ@GeneratedValue(generator = "preferenceSequence")ている例では定義されていません。 @GeneratedValue(generator = "bSequence")

デフォルトでは、休止状態の割り当てサイズは 50 です。B: IDS=50 は、マッピングが間違ったシーケンスを選択していることを示唆しているようです。

于 2012-11-17T19:52:22.907 に答える