2

@TableGenerator(name="Emp_Gen",table="ID_GEN", pkColumnName = "GEN_NAME",pkColumnValue = "Employee_GEN",valueColumnName = "GEN_VAL",initialValue = 1000,allocationSize = 100)

すべてはinitialValue問題ありませんが、効果的ではありません。以下は「従業員」という名前のテーブルです(注:MySql、Hibernate-JPAを使用)

という名前のテーブル

最初の行の 'id' は 1 ではなく 1000 だと思いますよね? でも 1 なら 2 番目は 101 にすべきです.

4

1 に答える 1

7

最初の値が 1001 ではなく 1 になるのは、Hibernate のバグHHH-4228であり、ステータスは Won't fixです。あなたの場合の正しい最初の値は1000ではなく1001です。これは、返された最後のinitialValue値を格納する列を初期化するためです(次に返される値ではありません)。

persistence.xml で以下を使用すると (バグ レポートでも提案されているように)、最初の値の問題が修正されます。

<property name="hibernate.id.new_generator_mappings" value="true"/>

問題の意味allocationSizeが誤解されている可能性があります。インクリメントするステップではありません。これは、テーブルから 1 回のデータベース クエリでいくつの値が割り当てられるかを意味します。これは、新しいエンティティに id 値が必要になるたびに追加のクエリを回避するための最適化です。

副産物として、アプリケーションを再起動すると、シーケンスに穴が生じることがよくあります。

  1. 初期値 = 1000、割り当てサイズ = 100
  2. 値 1001 を使用します (=> valueColumn の値は 1100 に更新されます)。
  3. アプリケーションをシャットダウンして起動する
  4. 次の値は 1002 ではなく 1101 になります。
于 2012-11-09T21:00:52.250 に答える