我在实体中有以下描述:
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Long id;
用于生成此 id 的 Liquibase 指令如下:
<column name="id" autoIncrement="true" type="INT">
<constraints nullable="false" primaryKey="true" primaryKeyName="pk_entity"/>
</column>
我还有 liquibase 脚本,可以将预定义值插入到该表中,例如
<insert tableName="entityTable" schemaName="public">
<column name="id">1</column>
<!- other fields-->
</insert>
当我尝试使用 Jpa 存储库插入没有 id 的新记录时,出现了问题。
我收到一条错误消息,如“重复的 ID”。
所以,我知道 jpa(hibernate) 不使用 postgresql 序列来获取新的 id 值。我不想将序列名称包含到实体的 ID 描述中。我希望postgresql本身能够解决这种情况。
我不会使用“hibernate_sequence”。
那么,我知道如何解决这个问题。
谢谢。
Liquibase 的说明autoIncrement="true"
产生serial
PostgreSQL 的列。为了serial
列 PostgreSQL 将创建一个名称如下的序列tablename_colname_seq
。默认列值将从该序列分配。
但是当你明确地将一个值插入到串行列中,它不会影响序列生成器,并且其下一个值不会改变。所以它可以生成一个重复的值,这正是你的情况。
为了防止在插入显式值后出现这种情况,您需要更改序列生成器的当前值ALTER SEQUENCE
声明或与setval()
函数,例如:
ALTER SEQUENCE tablename_colname_seq RESTART WITH 42;
SELECT setval('tablename_colname_seq', (SELECT max(colname) FROM tablename));
这应该可以解决问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)