如何在hibernate和postgres上同步id?

nimxete2  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(254)

也许有人也面临同样的情况?在我的项目中,我有两项服务。我使用liquebase创建数据库表。创建权限表时,我立即输入4个值​​有使用插入。一切都在嗡嗡作响。因此,现在在第二个服务(管理面板)中,我创建了一个允许您创建权限的apish。当我试图在权限表中创建一条记录时,其中已经有4条记录,我得到一个错误 ERROR: duplicate key value violates unique constraint "permissions_pkey" . 如果我发出了5次请求,就会出现错误,第5次添加记录。(提前感谢)

<insert tableName="permissions">
  <column name="id" value="1"/>
  <column name="name" value="USERS_READ"/>
</insert>
<insert tableName="permissions">
  <column name="id" value="2"/>
  <column name="name" value="USERS_GET"/>
</insert>
<insert tableName="permissions">
  <column name="id" value="3"/>
  <column name="name" value="USERS_CREATE"/>
</insert>
<insert tableName="permissions">
  <column name="id" value="4"/>
  <column name="name" value="USERS_DELETE"/>
</insert>
public class Permission {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; 
}
bxgwgixi

bxgwgixi1#

如果是标识列,则不必为 id liquibase脚本中的列。让数据库为您计算。毕竟,这就是使用identity列的意义所在。
如果以后需要在脚本中以某种方式引用id,请查找从正在使用的rdbms中获取最后插入的id的方法,通常会有如下方法 LAST_INSERTED_ID() . 或者,使用 name 列。

h43kikqp

h43kikqp2#

您正在使用生成类型标识,Map到postgres中的数据类型serial。当您想插入从管理面板创建的权限时,postgres使用一个序列,从您的描述中的1开始,id 1到4已经被手动插入使用。不要在手动插入中使用id,或者通过查询表中使用的当前最大id,在从管理面板创建的实体上显式设置id。考虑更改生成类型。

相关问题