私は次のものを持っています:
@Entity
@Table(name = "FooTbl")
public Foo{
@Id
@TableGenerator(name="TABLE_GEN", table="MY_SEQUENCE_TABLE", pkColumnName="SEQ_NAME",
valueColumnName="SEQ_COUNT",
pkColumnValue="MY_SEQ",
allocationSize=100000,
initialValue=100)
@GeneratedValue(strategy=GenerationType.TABLE, generator="TABLE_GEN")
@Column(name = "PK")
private Long pk;
}
これらのオブジェクトのステートレス コレクションを保存するたびに、それらはテーブルに挿入されますが、各オブジェクトには、その前に挿入されたものよりも低い主キーがあります。それらが十分にある場合、データベースの pk 列に負の数が表示されるようになります。
allocationSize 属性を削除すると、すべてが機能します(デフォルトは 50 です)。ただし、保存されているオブジェクトの数が多いため、大きな数が必要です。
理想的には、allocationSize を既存の Generator に渡すことができる Hibernate の組み込み機能としてこれを確認するのがよいでしょう。私が出会ったことのないものを知っている人はいないと思いますか?
シーケンスを使用できず、TableGenerator を使用する必要があります。誰にもこれに対する回避策がありますか?
アップデート:
次の非JPAの使用法も試しました。
@Id
@GenericGenerator(name = "TABLE_GEN", strategy =
"org.hibernate.id.enhanced.TableGenerator",
parameters = {
@Parameter(name = "TABLE_PARAM", value = "MY_SEQUENCE_TABLE"),
@Parameter(name = "VALUE_COLUMN_PARAM", value = "SEQ_COUNT"),
@Parameter(name = "SEGMENT_COLUMN_PARAM", value = "SEQ_NAME"),
@Parameter(name = "SEGMENT_VALUE_PARAM", value = "MY_SEQ"),
@Parameter(name = "INITIAL_PARAM", value = "100"),
@Parameter(name = "INCREMENT_PARAM", value = "100000")
})
@Column(name = "PK")
private Long pk;
次の行を追加すると、デフォルトの休止状態テーブルを探しているため、別のエラーが発生します。
@GeneratedValue(generator="TABLE_GEN")
その行を追加するときのエラーは次のとおりです。
Hibernate: select tbl.next_val from hibernate_sequences tbl where tbl.sequence_name=? for update
ERROR org.hibernate.id.enhanced.TableGenerator - HHH000351: Could not read or init a hi value
java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
現在、休止状態の構成ファイルには次の設定があります。
<prop key="hibernate.jdbc.batch_size">250</prop>
<prop key="hibernate.order_inserts">true</prop>
<prop key="hibernate.order_updates">true</prop>
<prop key="hibernate.cache.use_query_cache">false</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.jdbc.batch_versioned_data">true</prop>
<prop key="hibernate.connection.autocommit">true</prop>
<prop key="hibernate.id.new_generator_mappings">true</prop>
<prop key="hibernate.jdbc.use_get_generated_keys">true</prop>
最終更新:
設定された休止状態のプロパティが、不規則な問題の原因だったようです。hibernate.jdbc.batch_versioned_data、hibernate.id.new_generator_mappings、および hibernate.jdbc.use_get_generated_keys エントリをコメントアウトすると、それらが機能しているように見えます (元の JPA TableGenerator コードを使用)。