JPA / Hibernate / Derby TableGenerator 使用负值

2024-01-08

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

我定义了一个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 为负数,则序列号会变小。

去尝试更多的事情......


我看了一下JPA规范 http://jcp.org/aboutJava/communityprocess/final/jsr220/并且似乎没有任何与初始值有关的约束相关的内容,因此这可能取决于实现。含义:如果您希望符合标准,则不应使用负初始值。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA / Hibernate / Derby TableGenerator 使用负值 的相关文章

随机推荐