【问题标题】:Postgresql: How @GeneratedValue works in postgresql?Postgresql:@GeneratedValue 如何在 postgresql 中工作?
【发布时间】:2014-11-19 03:58:02
【问题描述】:

我对 postgresql 很陌生。 在使用 Ebean 的 playframework 中,我使用了 mysql 和自动生成的值,在这种情况下实际上是自动递增的。我得到的序列是1,2,3,4...

但在 Postgresql 中,生成的值似乎没有这样的属性。似乎对于每个会话,它都以比前一个会话的编号更大的数字开始,然后自动递增。本例中的序列,1,21,41,42,61,81,101,102,103...

我的代码段:

@Entity
public class Post extends Model{

    @Id
    @GeneratedValue
    @Required
    public int id;

我正在使用:

  1. Playframework 2.3.4
  2. 豆豆
  3. Postgres 9.3

我真的不知道原因。这种价值观有什么特别的原因吗?这有什么问题吗?我需要切换到自动增量吗?如果是这样,我该怎么做?

【问题讨论】:

  • 底层 JPA 提供程序是什么?休眠?日食链接?还有什么?当您启用查询日志记录时,它实际运行的是哪些查询?对于 PostgreSQL,你想说服 ORM 使用 PostgreSQL 序列,但是一些 Java ORM 对此非常沮丧。
  • 抱歉来晚了,我正在使用 Ebean 作为 ORM。

标签: postgresql playframework-2.0 ebean postgresql-9.3


【解决方案1】:

K,所以您使用的是 AUTO 策略,因为它是默认策略。我对 Ebean 了解不多,但是使用 Hibernate,会创建一个名为 hibernate_sequence 的序列。

此序列将由其他实体共享,因此这可能是造成差距的部分原因。出于性能原因,您的 ORM 也可能会预先分配序列值。

无论哪种方式,我总是对 Postgres 使用 IDENTITY 策略,即使 Postgres 不使用 IDENTITY。但是,它确实为每个表创建了一个序列,这通常是您想要的。

【讨论】:

  • 有趣的是,如果序列与其他实体共享,我应该得到 2 到 20 作为我得到序列 1,21,41,42,61,81,101,102,103 的其他实体的 id为了这个实体,对吧?但我没有得到这样的东西。可能是我误解了你想说的。
  • @ShakibAhmed 只是使用 IDENTITY 策略,它应该做你想做的事。它可能按原样预先分配 id,但您必须查看源以确定。
猜你喜欢
  • 2017-08-31
  • 2022-01-22
  • 2012-02-14
  • 2021-11-15
  • 1970-01-01
  • 2015-08-13
  • 2023-03-24
  • 1970-01-01
  • 2021-01-09
相关资源
最近更新 更多