「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が何であるかを知っている必要があるためです。たとえば、次のシナリオについて考えてみます。
- 新しいProductオブジェクトを作成し、保存します。 OracleがIDを割り当てます。
- 製品をHibernateセッションから切り離します。
- 後で再接続して、いくつかの変更を加えます。
- これらの変更を永続化する必要があります。
IDを知らなければ、Hibernateはこれを行うことができません。 UPDATEステートメントを発行するにはIDが必要です。したがって、org.hibernate.id.GUIDGenerator
の実装 事前にIDを生成し、後でINSERTステートメントで再利用する必要があります。
これは、Hibernateがバッチ処理を実行できないのと同じ理由です。 データベースで生成されたIDを使用する場合(それをサポートするデータベースでの自動インクリメントを含む)。 hiloジェネレーターの1つ、またはHibernateで生成された他のIDメカニズムを使用することが、一度に多数のオブジェクトを挿入するときに優れたパフォーマンスを得る唯一の方法です。