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

理想情况下,最好将其视为 Hibernate 中的内置功能,您可以将 allocationSize 传递给现有的生成器。我想没有人知道我没有遇到过的一个吗?

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

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.jdbc.batch_versioned_data、hibernate.id.new_generator_mappings 和 hibernate.jdbc.use_get_generated_keys 条目时,看起来它们正在工作(使用原始的 JPA TableGenerator 代码)。

4

1 回答 1

1

这听起来真的很奇怪。根据代码,如果您将增量设置为高于 1 的值,则会获得不同的优化器。我会尝试覆盖 @TableGenerator 注释上的“优化器”选项,将其设置为 NoopOptimizer 。它应该将行为“重置”为与优化器设置为 1 相同的行为,但增量本身除外。如果这可行,我会尝试联系开发人员,以了解这是否是一个错误。

注意:您没有指定您使用的是哪个版本的 Hibernate,因此,我在 Hibernate 的 github 上查看了最新的代码。

于 2012-08-18T08:05:47.957 回答