我有以下内容:
@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代码)。
答案 0 :(得分:1)
这听起来很奇怪。 Based on the code,如果将增量设置为大于1的值,则会获得不同的优化器。我会尝试覆盖@TableGenerator注释上的“优化器”选项,将其设置为NoopOptimizer。它应该将行为“重置”到同一个行为,就像优化器设置为1一样,除了增量本身。如果这样做,我会尝试联系开发人员,以了解这是否是一个错误。
注意:你没有指定你正在使用哪个版本的Hibernate,所以,我检查了Hibernate的github上的最新代码。