当前位置: 首页 > 面试题库 >

休眠使用PostgreSQL序列不会影响序列表

柯升
2023-03-14
问题内容

我已将Hibernate配置为使用PostgreSQL序列(通过注释)为主键 id 列生成值,如下所示:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
    return this.id;
}

通过这种配置,我看到的是,hibernate时,hibernate已经分配了 id 值> 3000,而对已用序列的查询显示了以下内容:

database=# select last_value from entity_id_seq;
last_value 
------------
     69

(1列)

问题:
是否有错?
hibernate状态应该与序列表同步吗?
如果不是,它将在哪里存储最后生成的ID?

谢谢。


问题答案:

我有同样的问题。它与Hibernate的id分配策略有关。在不选择 GenerationType.SEQUENCE的情况下
,Hibernate使用HiLo策略,默认情况下以50个块分配ID。因此,您可以像这样显式设置 allocationSize 值:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
    return this.id;
}

不过,我也听到过这样的观点,即在 分配大小= 1的 情况下使用HiLo策略不是一个好习惯。有些人建议在必须处理数据库管理的序列时改用
GenerationType.AUTO

更新: 我确实最终使用了分配大小=
1,并且事情似乎按我现在期望的那样工作。我的应用程序使得我真的不需要ID块,所以YMMV。



 类似资料:
  • 问题内容: 我已将hibernate配置为使用oracle序列。使用cache = 20,increment = 1创建序列。 一切正常,hibernate持久实体。id值很奇怪:50,51 .... 76,201,202 … 209,1008,1009,5129,5130 .... 如果我要求序列值(从双重选择hibernate_sequence.nextval),我会得到像2,3,4 …的值。

  • 问题内容: 我的数据库是Oracle,我的id列值是Oracle序列,此序列由触发器执行,因此,在插入每一行之前,此触发器使用此序列来获取id值。因此,我对应该在实体类中定义哪个id策略生成感到困惑。 要么 要么 真的很困惑,有人可以阐明这个话题吗?请清楚解释。 问题答案: 我还有一个projet,其中有一个Oracle DB将数据提供给我的@Entity类。如您所说,序列通过触发器生成表PK的I

  • 问题内容: 是否可以对 不是标识符/不是复合标识符一部分的 某些列使用DB序列? 我正在将hibernate用作jpa提供程序,并且我有一个表,其中包含一些生成的值(使用序列)的列,尽管它们不是标识符的一部分。 我想要的是使用序列为实体创建新值,其中序列的列 不是 主键(的一部分): 然后,当我这样做时: 该ID将被生成,但该属性也将由我的JPA提供程序生成。 为了清楚起见:我希望 Hiberna

  • 问题内容: 有谁知道那里是否有一个能够从实体类中剥离Hibernate集合以使其可序列化的框架?我看了一下BeanLib,但它似乎只做实体的深层副本,而不允许我为实体类中的集合类型指定实现映射。BeanLib当前不适用于Hibernate 3.5和Spring 3(我确实修改了源代码并能够使其正常工作,但我不想这样做)。吉利德(Gilead)似乎是一个选择,但它似乎具有侵入性。我宁愿使用简单的深度

  • 问题内容: 尝试将Hibernate与SAP HANA内存数据库连接时遇到一些性能问题,该数据库不支持AUTO_INCREMENT(http://scn.sap.com/thread/3238906)。 因此,我将Hibernate设置为使用序列进行ID生成。 但是,当我插入大量记录(例如40000)时,Hibernate首先会生成ID。看起来像: 并且只有在生成所有ID之后,它才开始实际插入。

  • 问题内容: 我似乎在Hibernate中映射列表时遇到问题。在我们的项目中有一类用含有类与含有。 Hibernate 是否可以使用注释进行映射?我的意思是,因为它没有注释? 问候 问题答案: 用途: 资料来源: 7.2.3。基本类型和可嵌入对象的集合