【问题标题】:Hibernate 4.2.21 GenerationType.SEQUENCEHibernate 4.2.21 GenerationType.SEQUENCE
【发布时间】:2016-04-06 12:21:51
【问题描述】:

我正在使用 Hibernate 4.2.21 Final 来生成我使用的 ID:strategy=GenerationType.SEQUENCE

@Id 
@SequenceGenerator(name = "ApplicationSequence", sequenceName =
"application_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ApplicationSequence")      
@Column(name = "application_id", unique = true, nullable = false) private Long id;

我的问题是关于为什么 Hibernate 以随机方式生成我的 ID ...

如 1、2、3、67、89、96 等...

当我的 allocationSize = 1 时?应该是这样的:1,2,3,4,5,6。

编辑: ORACLE 12 中的安全性

CREATE SEQUENCE  "OSYDBA"."APPLICATION_SEQ"  
MINVALUE 1 MAXVALUE 9999999999999999999999999999 
INCREMENT BY 1 START WITH 1
CACHE 20 NOORDER  NOCYCLE  NOPARTITION ;

【问题讨论】:

  • 你是如何在 oracle 端生成序列的?
  • 是的,你可以在我最初的帖子中找到它,在 EDIT 中
  • 您是否对任何其他实体使用相同的序列?
  • 真的有问题吗?这是与性能要求进行权衡的结果。您不能拥有并发、快速、无间隙的序列生成器。
  • @ibre5041 如果多个实体使用相同的序列,则表中插入的行可能不按顺序。

标签: java oracle hibernate oracle11g


【解决方案1】:

不要让 Oracle 预缓存任何序列值:

CREATE SEQUENCE APPLICATION_SEQ
      INCREMENT BY 1
      START WITH 1
      NOMAXVALUE
      NOCYCLE
      NOCACHE;

【讨论】:

  • 啊!好,谢谢!!你能解释一下原因吗..为什么不呢??
  • 使用序列生成器,您告诉 Hibernate 从 Oracle 获取有效的序列号,因此 Oracle 将以 20 个块(您定义的缓存大小)获取序列号,然后使用内部缓存返回它们。
  • 序列中的问题不仅仅是缓存,甚至是NOORDER子句; for Oracle documentation: "如果您不想保证按请求顺序生成序列号,请指定 NOORDER。这是默认设置。"
  • @Aleksej 非常正确,我错过了发布序列中的 NOORDER。
  • 你为什么不放 分句?应该更好吧?另一个重要的一点是“如果您将 Oracle 数据库与 Real Application Clusters 一起使用,则只有在保证有序生成时才需要 ORDER”我们在一个具有两个节点的集群应用程序中......
猜你喜欢
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 2018-09-26
  • 2015-12-19
  • 2013-05-03
  • 2017-08-03
相关资源
最近更新 更多