为什么Hibernate TableSequence递减?

时间:2012-08-17 19:04:40

标签: java hibernate

我有以下内容:

@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)。但是,由于存储的对象数量,我需要一个很高的数字。

理想情况下,将它看作Hibernate中的内置功能会很好,您可以将allocationSize传递给现有的Generator。我不认为有人知道我没有遇到的那个吗?

我不能使用Sequences,必须使用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;

如果我添加以下行,我会得到一个不同的错误,因为它正在寻找默认的hibernate表。

   @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

hibernate配置文件目前有以下设置:

            <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属性导致了不稳定的问题。当我注释掉hibernate.jdbc.batch_versioned_data,hibernate.id.new_generator_mappings和hibernate.jdbc.use_get_generated_keys条目时,看起来它们正在工作(使用原始的JPA TableGenerator代码)。

1 个答案:

答案 0 :(得分:1)

这听起来很奇怪。 Based on the code,如果将增量设置为大于1的值,则会获得不同的优化器。我会尝试覆盖@TableGenerator注释上的“优化器”选项,将其设置为NoopOptimizer。它应该将行为“重置”到同一个行为,就像优化器设置为1一样,除了增量本身。如果这样做,我会尝试联系开发人员,以了解这是否是一个错误。

注意:你没有指定你正在使用哪个版本的Hibernate,所以,我检查了Hibernate的github上的最新代码。

相关问题