0

私は次のものを持っています:

@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 コードを使用)。

4

1 に答える 1

1

これは本当に奇妙に聞こえます。コードに基づいて、増分を 1 より大きい値に設定すると、別のオプティマイザが取得されます。@TableGenerator アノテーションの「optimizer」オプションをオーバーライドして、 NoopOptimizer に設定しようとします。インクリメント自体を除いて、オプティマイザが 1 に設定されている場合と同じ動作に「リセット」する必要があります。これが機能する場合は、これがバグであるかどうかを理解するために、開発者に連絡を取ります。

注: 使用している Hibernate のバージョンを指定しなかったため、Hibernate の github で最新のコードを確認しました。

于 2012-08-18T08:05:47.957 に答える