我希望我的数据库中生成的主键为负整数。
我定义了一个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为负数,则序列号会变小。
关闭尝试更多的事情......
答案 0 :(得分:0)
我看了一下JPA specification,似乎没有任何与初始值的约束有关,所以这可能是依赖于实现的。含义:如果您希望符合标准,则不应使用负初始值。
您是否尝试过设置allocation-size ="-1"
?我现在不能尝试这个,但我很好奇Hibernate是如何表现的,因为数据库可以有负序号。