我希望数据库中生成的所有主键均为负整数。
我定义了一个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?
Thanks
Update
我这样做是因为我要将数据从一个数据库移动到另一个数据库。然后我将数据移回来。在此期间,可以在另一个数据库(Derby)中创建新实体。当我将实体移回原处时,我需要一种方法来判断它们是否是在该数据库上创建的,而不需要更改表架构。我想我会检查 id 是否有负值,并且我知道当我将数据移回时必须将其创建为新实体。
有谁知道 Hibernate 类生成什么来处理 TableGenerator 并生成序列的表代码?
Update 2
经过一些测试后,Hibernate 在使用表生成器时似乎忽略了初始值和分配大小。
我将此属性添加到 persistence.xml
<property name="hibernate.id.new_generator_mappings" value="true"/>
我切换到序列生成器,初始值已正确使用,但分配大小未保存为负值。根据德比规范,负序是有效的。
来自10.6参考:
如果指定,则 INCREMENT 值是适合 DataType 值的非零数字。如果未指定,则 INCREMENT 默认为 1。INCRMENT 是序列生成器前进的步长。如果 INCREMENT 为正数,则序列号会随着时间的推移而变大。如果 INCREMENT 为负数,则序列号会变小。
去尝试更多的事情......