【问题标题】:Hibernate save with nextval使用 nextval 休眠保存
【发布时间】:2018-05-17 12:19:35
【问题描述】:

当我尝试保存一个实体时可以执行选择吗?对于示例,我有这个实体:

@Entity
public class MyEntity{
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String name;

  private String number; 

}

我的财产编号我想执行一个

select nextval('numberGenerator')

这个 numberGenerator 会生成一个没有间隙的数字序列,即使我的插入失败他也不会丢失序列

【问题讨论】:

  • 你在使用oracle和oracle序列吗?
  • 您是在尝试为某些国家/地区审计规则要求没有间隙的发票编号等事物实施无间隙数字范围,还是您只是想避免这种情况,以免在插入失败?
  • 这不会创建无缝 ID。无间隙 id 是一个非常糟糕的主意,因为它们需要强大的并发约束。

标签: hibernate spring-boot jpa spring-data-jpa


【解决方案1】:

我使用@SequenceGenrator 来使用保存在数据库端的序列。您的序列应该通过 nextval 创建一个新的 id。

 @Id
 @SequenceGenerator(sequenceName = "numberGenerator", name = "numberGenerator", allocationSize = 1, initialValue = 1)
 @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "numberGenerator")
 private Long id;

【讨论】:

  • 在这种情况下,如果我的保存失败,他会丢失序列。
  • @FabioEbner 你确定这会发生吗?
  • @Patrick 可以。想象一下持久化即将发生的时刻。 Hibernate 向序列生成器询问下一个值,此时序列增加 1。然后插入语句发生,但不应为 null 的字段是;插入失败并且事务回滚。此时,NEXTVAL 序列丢失了,因为数据库在原子增量块中生成这些序列,以保证它不会同时向多个事务发出相同的序列。
  • @Naros 感谢您的解释。我不会删除我的答案,因为您的解释可能对我和其他人有帮助。
猜你喜欢
  • 2021-09-22
  • 2014-09-27
  • 2011-12-16
  • 2011-09-29
  • 2016-11-29
  • 1970-01-01
  • 2015-01-14
  • 2012-09-09
  • 1970-01-01
相关资源
最近更新 更多