gpt4 book ai didi

java - JPA/Hibernate/Derby TableGenerator 使用负值

转载 作者:行者123 更新时间:2023-11-29 09:22:57 29 4
gpt4 key购买 nike

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

我定义了一个 TableGenerator:

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

我假设这会从 -1000000 开始生成第一个 key 并将每个 ID 递增 1。因此下一个 ID 将是 -999999。

当我创建并保留一个新实体时,出现以下错误:

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

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

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

谢谢

更新

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

有谁知道 Hibernate 类生成的是什么来处理 TableGenerator 并为序列生成表代码?

更新 2

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

我将此属性添加到 persistence.xml

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

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

来自 10.6 引用:

If specified, the INCREMENT value is a non-zero number which fits in a DataType value. If not specified, the INCREMENT defaults to 1. INCREMENT is the step by which the sequence generator advances. If INCREMENT is positive, the sequence numbers get larger over time. If INCREMENT is negative, the sequence numbers get smaller.

去尝试更多的东西......

最佳答案

我看了一下JPA specification并且似乎与初始值的约束没有任何关系,因此这可能取决于实现。意思是:如果您希望符合标准,则不应使用负初始值。

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

关于java - JPA/Hibernate/Derby TableGenerator 使用负值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4993683/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com