【问题标题】:creating sequence Id in hibernate在休眠中创建序列ID
【发布时间】:2016-07-11 21:41:40
【问题描述】:

我想使用休眠工具(pojo to sql)生成序列。绝对可以正常工作。

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqid-gen")
@SequenceGenerator(name = "seqid-gen", sequenceName = "RTDS_ADSINPUT_SEQ" )
@Column(name="id")  
public Long getId() {  
    return id;  
} 

这段代码在sql下面生成

create sequence RTDS_ADSINPUT_SEQ;  

问题是我想指定类似的属性

START WITH, INCREMENT BY, NOCACHE

最终的 ddl 脚本应该如下所示

CREATE SEQUENCE  RTDS_ADSINPUT_SEQ  MINVALUE 1 MAXVALUE
999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE;

但目前我看到hibernate只支持name、sequncename、allocationSize、initialvalue。我的疑问是,如果我们使用 allocationSize = 1 & initialValue = 1,我们是否还需要提及“nocache”。如果是这样,我们是否有任何类型的“nocache”注释?

如果我可以将该属性作为注释包含在 pojo 中,请告诉我。

【问题讨论】:

  • 最好使用 guid 作为标识符。所有这些问题都消失了,就像变魔术一样(被完全不同但更简单的一组问题所取代)
  • 为什么不直接指定 initValue 和 allocationSize 看看会发生什么?!!
  • 如果您喜欢为每个主键和外键值存储大量数据,则对象 ID 的 GUID 非常有用。如果您的公司通过销售存储解决方案赚钱,那么请出去告诉全世界使用 GUID 而不是 4 字节 (Int) 或 8 字节 (BigInt) 类型的 ID。不要忘记所有这些 ID 最终都在索引中,因此表空间不仅更大,而且引用这些对象的每个索引也最终变得更大。还要告诉他们,当访问的数据比你必须的多时,对性能没有影响:) 这就是云的用途,对吗?

标签: java hibernate jpa primary-key sequence


【解决方案1】:

序列仅使用 oracle、postgreSQL、DB2、H2

我知道两种情况。

(1)

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int idx;

Auto_increment,序列对象 -> strategy = GenerationType.AUTO

(2) 你的情况。

元素详情

public abstract String name (必需)唯一的生成器名称, 可以被一个或多个类引用为生成器 主键值。

public abstract String sequenceName(可选) 从中获取主键值的数据库序列对象。 默认为提供者选择的值。默认值:hibernate_sequence

public abstract int initialValue (可选) 序列对象开始生成。默认值:1

public abstract int allocationSize (可选)要增加的数量 通过从序列中分配序列号时。默认值:50

DDL

create sequence RTDS_ADSINPUT_SEQ start with 1 increment by 1;

实体

@Entity
@SequenceGenerator(
name = "seqid-gen", 
sequenceName = "RTDS_ADSINPUT_SEQ" 
initiaValue = 1, allocationSize = 1)
public class XXX {

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seqid-gen")
   private long id;

    //getter, setter
}

【讨论】:

  • 感谢@Byeon0gam,我已经为您提供了解决方案,但对“nocache”进行了一些更改。创建表后,我使用 liquibase sql 标签创建了序列,并在我的实体类 sequenceName 中使用了该序列名称。现在一切正常。
【解决方案2】:

据我所知,我们没有这样的注释属性。但理想情况下,您应该使用自己的 SQL 查询来创建序列,而不是使用 hibernate 生成的默认查询。当数据库中存在序列时,Hibernate不会生成序列,您也可以禁用hibernate ddl生成。

【讨论】:

    【解决方案3】:

    我们可以通过下面提到的方式使用hibernate生成序列id

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int uniqueid;
    

    【讨论】:

      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      • 2018-04-07
      • 2014-05-14
      相关资源
      最近更新 更多