3

これは、休止状態に関する 2 回目の投稿です。休止状態を使い始めてから、解決した問題よりも多くの問題が発生しました。普通の古い JDBC にこだわるべきだったような気がします。ともかく、

これが私が戦おうとしている問題の1つです。

.hbm ファイルのシーケンス ジェネレーターは次のようになります。

<id name="id" type="long" column="ID">
    <generator class="sequence">
        <param name="sequence">ADVENTURES_ID_SEQ</param>
        <param name="allocationSize">1</param>
        <param name="initialValue">17599</param>
    </generator>
</id>

注: 初期値は 17599 です。これは、Oracle シーケンスの LAST_NUMBER が 17599 であるためです。

CREATED         25-APR-12
LAST_DDL_TIME   25-APR-12
SEQUENCE_OWNER  ADVENTURE_ADMIN
SEQUENCE_NAME   ADVENTURES_ID_SEQ
MIN_VALUE       1
MAX_VALUE       9999999999999999999999999999
INCREMENT_BY    1
CYCLE_FLAG      N
ORDER_FLAG      N
CACHE_SIZE      20
LAST_NUMBER     17599

コードを実行すると、次のシーケンスが Hibernate Debug ステートメントで 200、201 として生成されていることがわかります。

DEBUG SQL - select ADVENTURES_ID_SEQ.nextval from dual
DEBUG SequenceGenerator - Sequence identifier generated: 201

nextval は 17600 であると予想していました。オラクル シーケンスがまったく使用されていないようです。

構成のどこが間違っているのか、それを修正する方法を教えてください。どんな助けでも大歓迎です。

ありがとう

4

1 に答える 1

2

自己回答 (回避策): まだ問題が発生していますが、今のところ回避策があります。それは私にとってはうまくいったので、質問を完全なものとして選択しています。

トリガーを使用して Oracle に nextId を生成させます。

create or replace
TRIGGER ADVENTURE_ADMIN.ADVENTURES_ID_TRIG 
BEFORE INSERT ON ADVENTURE_ADMIN.ADVENTURES FOR EACH ROW
WHEN (new.ID IS NULL)
BEGIN
    SELECT ADVENTURES_ID_SEQ.NEXTVAL INTO :new.ID FROM DUAL;  
END;

次に、Hibernate に Oracle Trigger で生成された ID を使用させます。これには 2 つの方法があります。

まず、Hibernate selectを使用します。このアプローチの欠点は、行をフェッチするためのキーとして休止状態で使用される一意の制約を持つ別の列がテーブルに必要になることです。唯一の一意のキーとして主キーを持つテーブルがあるため、実際には機能しません。

2 つ目は、Jean-Pol Landrain、Martin Zeltner によって作成された TriggerAssignedIdentityGenerator を使用することです。ソースはここにあります。これにより、テーブルの別の一意のキーを見つけるという問題を回避できました。

以下は私がそれを使用している方法です:

<id name="id" type="long" column="ID">
    <generator class="org.hibernate.id.TriggerAssignedIdentityGenerator" />
</id>

注意: 使用している Hibernate のバージョンが重要です。私は3.5.4を使用しています。hibernate 3.6 はうまくいきませんでした。JDBC および Oracle ドライバーのバージョンも重要です。同じことについては、ソース ファイル内のドキュメントを参照できます。

于 2012-05-01T21:35:00.283 に答える