Postgresql 是否可以在没有ID的情况下使用自动递增编号?

Postgresql 是否可以在没有ID的情况下使用自动递增编号?,postgresql,hibernate,jpa,Postgresql,Hibernate,Jpa,我一直在谷歌上搜索,发现唯一的方法就是使用 @Id @GeneratedValue(strategy = GenerationType.Identity) 但我已经有了主键,我只需要另一个自动递增的字段。通过手动计算很难编写代码。也许您可以尝试: @GeneratedValue(GenerationType.strategy=SEQUENCE, generator="internal_seq") @SequenceGenerator(name="internal_seq", sequenceN

我一直在谷歌上搜索,发现唯一的方法就是使用

@Id
@GeneratedValue(strategy = GenerationType.Identity)
但我已经有了主键,我只需要另一个自动递增的字段。通过手动计算很难编写代码。

也许您可以尝试:

@GeneratedValue(GenerationType.strategy=SEQUENCE, generator="internal_seq")
@SequenceGenerator(name="internal_seq", sequenceName="internal_seq", allocationSize=1)
@Column(name="internalID")
public Long internalID;

我看到以下选项:

1) 可以使用注释

您应该以以下方式声明一个表:

创建序列TST_数据_SEQ增量1,从1开始;
创建表TST_数据(
...
dat_自动整数默认值nextval('TST_数据顺序'),
...
);
以及实体中的相应列:

@Generated(value=GenerationTime.INSERT)
@列(name=“dat\u auto”,insertable=false,updateable=false)
私人长途汽车;
请注意,根据:

标记为已生成的属性还必须是不可插入和不可更新的

因此,hibernate将在刷新后进行额外的查询以填充
auto
字段

数据数据=新数据();
//填充除data.auto之外的字段
会话.持久化(数据);
session.flush();
2) 可以使用注释

您应该有一个hibernate
ValueGenerator
的实现。下面是一个简单的例子

import java.math.biginger;
导入org.hibernate.Session;
导入org.hibernate.tuple.ValueGenerator;
公共类MyGenerator实现ValueGenerator
{
公共长生成值(会话、对象所有者)
{
返回(
(BigInteger)会话
.createNativeQuery(“选择下一步('TST\U数据顺序'))
.getSingleResult()
).longValue();
}
}
然后你可以这样使用它:

@GeneratorType(type=MyGenerator.class,when=GenerationTime.INSERT)
@列(name=“dat\u auto”)
私人长途汽车;
在这种情况下,您不应该像n1中所要求的那样为列声明提供默认值。并且相应的实体字段不应该有
@列(…insertable=false,updateable=false)
。每次保存此实体时,hibernate都会生成查询:

select nextval('TST_DATA_SEQ')

并将该值填入
自动
字段。

这是否回答了您的问题?没有,只是尝试了@Column(name=“internalID”)@Generated(GenerationTime.INSERT)private Long internalID;它什么也没做。插入后值为null如果执行
@Column(name=“internalID”)
然后执行
@GeneratedValue(strategy=GenerationType.IDENTITY)
,则会发生什么情况?不,插入后为nullinserts@erotsppa你能解释一下你为什么这么做吗?您试图解决的初始问题是什么?不,create上的null这两个解决方案都需要创建序列TST_DATA_SEQ,您知道如何在spring startup中自动执行此操作吗?我不想求助于我的CD管道来做这种事情实际上我尝试了你的第二个解决方案,它进入了generateValue()中的无限循环至于序列创建,请看spring boot。我在这个简单的应用程序上测试了这两种建议的方法(只有hibernate 5.4.4.Final依赖项),它们工作得很好。看来,generateValue()中的无限循环问题与项目集成有关。
select nextval('TST_DATA_SEQ')