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

标签 postgresql hibernate jpa

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

@Id
@GeneratedValue(strategy = GenerationType.Identity)

但是我已经有了一个主键,我只需要另一个自动递增的字段。通过手动计算来编码它真的很难。

最佳答案

我看到以下选项:

1) 您可以使用 @Generated注解。

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

create sequence TST_DATA_SEQ increment by 1 start with 1;

create table TST_DATA (
   ...
   dat_auto integer default nextval('TST_DATA_SEQ'),
   ...
);

和实体中的适当列:

   @Generated(value = GenerationTime.INSERT)
   @Column(name = "dat_auto", insertable = false, updatable = false)
   private Long auto;

注意根据documentation :

Properties marked as generated must additionally be non-insertable and non-updateable.



因此,hibernate 将进行额外的查询来填充 auto冲洗后的字段。

   Data data = new Data();
   // filling fields except data.auto
   session.persist(data);
   session.flush();
insert into TST_DATA (dat_name, dat_id) 
values (?, ?)

Hibernate: /* get generated state com.example.hibernate.Data */
  select data_.dat_auto as dat_auto_0_ 
  from TST_DATA data_ 
  where data_.dat_id=?

2) 您可以使用 @GeneratorType注解。

你应该有一个 hibernate 的实现 ValueGenerator .你可以在下面看到一个简单的例子。

import java.math.BigInteger;
import org.hibernate.Session;
import org.hibernate.tuple.ValueGenerator;

public class MyGenerator implements ValueGenerator<Long> 
{
   public Long generateValue(Session session, Object owner)
   {
      return (
         (BigInteger) session
            .createNativeQuery("select nextval('TST_DATA_SEQ')")
            .getSingleResult()
         ).longValue();
   }
}

然后你可以像这样使用它:

   @GeneratorType(type = MyGenerator.class, when = GenerationTime.INSERT)
   @Column(name = "dat_auto")
   private Long auto;

在这种情况下,您不应像 n1 中要求的那样为列声明提供默认值。并且适当的实体字段不应有 @Column(... insertable = false, updatable = false) .每次持久化这个实体时,hibernate 都会生成查询:
select nextval('TST_DATA_SEQ')

并将此值填充到 auto field 。

关于postgresql - 是否可以在没有 ID 的情况下使用自动增量编号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60198528/

相关文章:

java - JPA-存储库保存 : Proceed saving after insert Constraint violation

database - 使用示例数据填充 postgres 数据库

java - 在 jpa 中选择带有 order by 的案例

jakarta-ee - 如何获取持久对象的 SingularAttribute 映射值?

mysql - 无法在 eclipse 中创建 jpa 表

sql - assignment_code 必须是唯一的,但我不希望它是

sql - EXPLAIN ANALYZE 在 PL/pgSQL 中给出错误 : "query has no destination for result data"

postgresql - 将 PostgreSQL 数据库加载到 SchemaRDD

postgresql - postgres jsonb_set 多键更新

java - 如何自动记录 @Entity 上的任何更改?