sql >> データベース >  >> RDS >> Oracle

主キーにOracleのSYS_GUID()を使用するようにHibernateを構成します

    「GUID」ジェネレーターを使用できる場合があります。 Hibernateフォーラムからのこの投稿を参照してください。 SYS_GUID()を使用してOracleのサポートを追加したようです しばらく前ですが、ドキュメントには、SQLServerと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ステートメントで再利用する必要があります。

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



    1. PL/pgSQL匿名コードブロック

    2. oci_bind_by_nameおよびto_datePHP/ OCI / Oracle

    3. SQL Serverにリンクサーバーログインを追加する(T-SQLの例)

    4. 列dbo、ユーザー定義関数、または集計dbo.Splitfnが見つからないか、名前があいまいです