我有以下内容:
@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 代码)。