7

SYS_GUID()新しい行を挿入するときにOracleの関数を使用するために休止状態にする方法を探しています。現在、私のDBテーブルはSYS_GUID()デフォルトとして使用されているため、hibernateが値を省略したSQLを単純に生成した場合は、機能するはずです。

すべてが機能していますが、現在、system-uuidジェネレーターを使用してコードでUUID/GUIDを生成しています。

@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "PRODUCT_ID", unique = true, nullable = false)
public String getId() {
    return this.productId;
}

これは問題ありませんが、GUIDがデータベースによって生成されたものであることが望ましいので、それらはシーケンシャルであり、パフォーマンスが向上する可能性があります。さらに、これを構成する方法を知りたいだけです。

構成にアノテーションを使用していますが、xml構成の例も素晴らしいです。

これがサンプルテーブル定義です(重要な場合):

CREATE TABLE SCHEMA_NAME.PRODUCT
(
    PRODUCT_ID RAW(16) DEFAULT SYS_GUID() NOT NULL,
    PRODUCT_CODE VARCHAR2(10 CHAR) NOT NULL,
    PRODUCT_NAME VARCHAR2(30 CHAR) NOT NULL,
    PRODUCT_DESC VARCHAR2(512 CHAR)
)

アップデート:

「guid」を使用したMatのソリューションは機能しました。生成されたSQLは次のとおりです。

Hibernate: 
    select rawtohex(sys_guid()) 
    from dual
Hibernate: 
    insert into PRODUCT
    (PRODUCT_CODE, PRODUCT_DESC, LOB_ID, PRODUCT_NAME, PROVIDER_ID, PRODUCT_ID) 
    values (?, ?, ?, ?, ?, ?)

挿入で列のデフォルト値を使用することはできないようです。そのため、アプリケーションで生成されたGUIDとデータベースのラウンドトリップのどちらかを選択できます。

4

3 に答える 3

5

「guid」ジェネレーターを使用できる場合があります。Hibernate フォーラムのこの投稿を参照してください。SYS_GUID()しばらく前にOracle のサポートを追加したようですが、ドキュメントにはまだ SQL Server と MySQL のみをサポートしていると書かれています。

JPA アノテーションはまだ使用していませんが、XML 構成を使用した例を次に示します。

<id name="PRODUCT_ID">
  <generator class="guid" />
</id>

編集: 2番目の質問に関して、Hibernateが次のようなことをできない理由を尋ねていると思います:

INSERT INTO PRODUCT (PRODUCT_ID, /* etc */)
SELECT SYSGUID(), /* etc */

その理由は、Hibernate がオブジェクトの ID を認識している必要があるためです。たとえば、次のシナリオを考えてみましょう。

  1. 新しい Product オブジェクトを作成して保存します。Oracle が ID を割り当てます。
  2. 製品を Hibernate セッションから切り離します。
  3. 後で再接続して、いくつかの変更を加えます。
  4. これらの変更を永続化する必要があります。

ID を知らなければ、Hibernate はこれを行うことができません。UPDATE ステートメントを発行するには、ID が必要です。したがって、 の実装でorg.hibernate.id.GUIDGeneratorは事前に ID を生成し、後で INSERT ステートメントで再利用する必要があります。

これは、データベースで生成された ID (それをサポートするデータベースでの自動インクリメントを含む) を使用すると、Hibernate がバッチ処理を実行できないのと同じ理由です。hilo ジェネレーターの 1 つ、または Hibernate によって生成されたその他の ID メカニズムを使用することが、多数のオブジェクトを一度に挿入するときに優れたパフォーマンスを得る唯一の方法です。

于 2009-05-11T05:49:31.797 に答える
0

ジェネレーターをネイティブに設定することでできると思います。Hibernate でそれを行う方法はよくわかりませんが、NHibernate では XML で次のようにします。

<id column="PRODUCT_ID">
  <generator class="native"/>
</id>
于 2009-05-11T05:29:21.503 に答える