JPA / Hibernate / Derby TableGenerator使用负值

时间:2011-02-14 15:03:40

标签: java hibernate jpa derby

我希望我的数据库中生成的主键为负整数。

我定义了一个TableGenerator:

 <table-generator name="MY_SEQ" table="MY_SEQUENCE_TABLE"
                    initial-value="-1000000" allocation-size="1" />

我假设这会在-1000000处启动第一个生成的密钥并将每个id递增1.因此下一个id将是-999999。

当我创建并持久保存新实体时,我收到以下错误:

java.sql.SQLIntegrityConstraintViolationException:语句已中止,因为它会在唯一或主键约束中导致重复键值...

当我检查MY_SEQUENCE_TABLE时,SEQUENCE_NEXT_HIGH_VALUE中的值是2.我尝试在ORM.xml中定义表生成器并作为注释,但行为是相同的。

是否可以在Hibernate中对PK使用负值?

由于

更新

我这样做是因为我正在将数据从一个数据库移动到另一个数据库。然后我将数据移回。在此期间,可以在其他数据库(Derby)中创建新实体。当我移回实体时,我需要一种方法来判断它们是否是在该数据库上创建的,而不更改表模式。我想我会检查ID为负值,我知道在我移回数据时必须将其创建为新实体。

有没有人知道Hibernate类生成什么来处理TableGenerator并生成序列的Table代码?

更新2

经过一些测试后,似乎Hibernate在使用表生成器时忽略了初始值和分配大小。

我将此属性添加到persistence.xml

<property name="hibernate.id.new_generator_mappings" value="true"/>

我切换到序列生成器并且正确使用了初始值,但分配大小未保存为负数。根据德比规范,负序列是有效的。

从10.6参考文献:

  

如果指定,INCREMENT值是一个非零数字,它适合DataType值。如果未指定,则INCREMENT默认为1. INCREMENT是序列生成器前进的步骤。如果INCREMENT为正,则序列号随时间变大。如果INCREMENT为负数,则序列号会变小。

关闭尝试更多的事情......

1 个答案:

答案 0 :(得分:0)

我看了一下JPA specification,似乎没有任何与初始值的约束有关,所以这可能是依赖于实现的。含义:如果您希望符合标准,则不应使用负初始值。

您是否尝试过设置allocation-size ="-1"?我现在不能尝试这个,但我很好奇Hibernate是如何表现的,因为数据库可以有负序号。