`
张洪财
  • 浏览: 275890 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate 下的oracle Id Generator sequence

    博客分类:
  • java
阅读更多

@SequenceGenerator(name="COMMONSEQ",sequenceName="COMMON_SEQ")
 @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="COMMONSEQ")

 

 

基本配置
    @Id
    @GeneratedValue(strategy=GenerationType.SEQUENCE) 
    public Integer getId() {
        return this.id;
    }
 
 这样hibernate自动生成一个名叫hibernate_sequence的sequence

SQL> select * from USER_SEQUENCES;

  

 

hibernate使用sequence的后台动作:
下面是一个save()动作,hibernate 先发出一个 select hibernate_sequence.nextval from dual;
Hibernate:
    select
        hibernate_sequence.nextval
    from
        dual
Hibernate:
    insert
    into
        DvdType
        (name, id)
    values
        (?, ?)
1:typeoracle5
 


用自动创建的hibernate_sequence的缺陷: 会使得多个表共用一个sequnce,造成同一个表序号不连续
TYPE表:
1:TypeExample21
2:TypeExample21
3:TypeExample21
4:TypeExample22
5:TypeExample23
6:TypeExample24
7:TypeExample25
8:TypeExample26
9:TypeExample27
10:TypeExample28
11:TypeExample29
12:TypeExample210
 QUALITY表
13:Qualityoracle5
14:QualityExample21
15:QualityExample22
16:QualityExample23
17:QualityExample24
18:QualityExample25
19:QualityExample26
20:QualityExample27
21:QualityExample28
22:QualityExample29
23:QualityExample210
 
 
所以建议,还是为每个表定义具体的sequence name


自定义sequence
@Entity
@SequenceGenerator(name="TypeSEQ",sequenceName="TypeSEQ_DB")
public class DvdType implements java.io.Serializable {

    @Id
    //@GeneratedValue            
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TypeSEQ")
 @Entity
@SequenceGenerator(name="QualitySEQ",sequenceName="QualitySEQ_DB")
public class QualityType implements java.io.Serializable {

    @Id
    //@GeneratedValue
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="QualitySEQ")
 
00:07:46,437 INFO  [STDOUT] Hibernate:
    select
        TypeSEQ_DB.nextval
    from
        dual
 00:08:52,437 INFO  [STDOUT] Hibernate:
    select
        QualitySEQ_DB.nextval
    from
        dual
 

 

hibernate的sequence ,生成的id,事务间缺省是50 increment
现象:
hibernate自动生成的sequence,在oracle下看,increment_by还是1

SQL> select * from USER_SEQUENCES;

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
SEQUENCE_DVD_TABLE_1                    1 1.0000E+27            1 N N          0        1511
USERSEQ_DB                              1 1.0000E+27            1 N N         20           1
GROUPSEQ_DB                             1 1.0000E+27            1 N N         20          21
 
但通过hibernate/JPA进行save/persist()操作,ID却是increment +50

SQL> insert into USERGROUP(ID,NAME) values(GROUPSEQ_DB.nextval,'group6');

1 row created.

SQL> select * from usergroup;

        ID NAME
---------- --------------------------------------------------
       200 group1
       250 group1
       300 group3
       350 group4
       400 group5
         9 group6               //这是手工insert的,上面5条记录是hibernate persist的

6 rows selected.

SQL> select GROUPSEQ_DB.nextval from dual;

   NEXTVAL
----------
        10
 
原因:
1.hibernate 对sequence参数以自己为准,不读oracle的参数
2.hibernate increment缺省就是50,大概跟 hibernate集群应用有关
 
解决:hibernate提供了allocationSize参数来设      
@Entity
@SequenceGenerator(name="GroupSEQ",sequenceName="GroupSEQ_DB",allocationSize=1)
public class UserGroup {


SQL> select * from usergroup;

        ID NAME
---------- --------------------------------------------------
       200 group1
       250 group1
       300 group3
       350 group4
       400 group5
        11 group8               这两条是用hibernate新存的
        12 group9
         9 group6
 

 

 

 

 

分享到:
评论

相关推荐

    Hibernate的generator属性

    2. **sequence**:这是针对 Oracle 数据库的,它使用序列(sequence)来生成 ID。你需要指定序列的名称。 ```xml <id name="id" column="id"> <generator class="sequence"> <param name="sequence">序列名 </...

    在hibernate中实现oracle的自动增长

    为了在Hibernate中利用Oracle的序列(sequence)特性,需要在Hibernate的映射文件中进行相应的配置。以下是一个示例,展示了如何为`Department`实体类配置序列生成器(sequence generator): ```xml <hibernate-...

    Hibernate Oracle sequence的使用技巧

    在Oracle数据库环境下,当需要为表创建自动增长的主键时,通常会使用Oracle的sequence机制。本文将详细介绍如何在Hibernate中使用Oracle sequence,以及在使用过程中应注意的一些事项。 首先,我们来看如何为不同的...

    Hibernate主键策略-sequence

    Hibernate通过`org.hibernate.id.SequenceGenerator`类来实现序列主键生成器。在`nextValue()`方法中,它会与数据库进行交互,获取序列的下一个值。这个过程涉及到JDBC操作,包括SQL的执行和结果的处理。 3. **...

    hibernate连接oracle数据库.pdf

    ### Hibernate 连接 Oracle 数据库的关键知识点 #### 1. Hibernate 概述 - **ORM概念**:对象关系映射(Object/Relational Mapping,简称ORM)是一种编程技术,用于将对象模型与关系型数据库之间的数据进行转换。...

    hibernate连接oracle数据库.doc

    【hibernate 连接 oracle 数据库】 一、Hibernate 概述 Hibernate 是一个流行的 Java 对象关系映射(ORM)框架,它提供了一种在 Java 应用程序中管理和操作关系数据库的方法。ORM 技术的核心思想是将面向对象的模型...

    hibernate中的generator的生成方式hibernate中的generator的生成方式

    在Hibernate中,`Generator`是负责生成主键值的策略,通常在`<id>`元素中通过`class`属性指定。不同的数据库和不同的应用场景可能需要不同的生成策略。接下来,我们将逐一介绍各种常见的生成策略及其适用场景。 ###...

    Hibernate映射文件id的generator配置方法

    * sequence(序列):在 DB2, PostgreSQL, Oracle, SAP DB, McKoi 中使用序列(sequence),而在 Interbase 中使用生成器(generator)。返回的标识符是 long, short 或者 int 类型的。 * assigned(自行分配):...

    Hibernate教程02_ID生成策略

    Hibernate中通过`@GeneratedValue(strategy = GenerationType.SEQUENCE)`和`@SequenceGenerator`进行配置。 5. ** Table **:通过一个专门的表来生成ID,适用于跨数据库平台的系统,因为它不依赖特定数据库的特性。...

    hibernate映射主键生成策略native

    虽然`<param name="sequence">CREDIT_RECORD_id</param>`在这个上下文中并不生效,但其含义是在使用特定于Oracle的sequence策略时指定序列名。实际上,在使用“native”策略时,Hibernate会根据当前数据库环境自动...

    Hibernate主键生成方式

    4. **Sequence方式**:`<generator class="sequence">` 这种方式主要用于支持序列的数据库,如Oracle。开发者可以定义一个序列名称,Hibernate会通过这个序列来生成主键。这种方式确保了主键的顺序性和唯一性,但不...

    Hibernate映射文件主键的生成

    在Hibernate的映射文件中,可以配置`<generator class="sequence">`,并指定序列名。例如: ```xml <id name="id" column="ID"> <generator class="sequence"> <param name="sequence">MY_SEQ </generator> </...

    Hibernate笔记 马士兵

    第1课 课程内容 6 第2课 Hibernate UML图 6...4、为Oracle指定定义的Sequence 22 5、TABLE - 使用表保存id值 23 三、 联合主键 24 1、xml方式 24 2、annotation方式 27 第14课 Hibernate核心开发接口(重点) 29 ........

    hibernate中自动生成主键的办法

    在Hibernate中,可以使用`<generator class="sequence">`来指定使用Sequence作为主键生成策略,并通过`<param name="sequence">SEQ_CHILD</param>`来指定具体的序列名称。这种方式适用于需要生成大量连续主键值的...

    hibernate注解说明文档

    - `native`:对于 Oracle 采用 Sequence 方式,对于 MySQL 和 SQL Server 采用 IDENTITY 方式。由数据库自动完成主键生成。 - `uuid`:采用 128 位的 UUID 算法生成主键,编码为 32 位 16 进制数字的字符串。 - `...

    快速Java和Oracle集成SSH开发注意问题.pdf

    - 当插入新记录时,如果`id`字段为空,则触发器会为其分配下一个序列值。 **7. 表空间的IMP, EXP** - IMP和EXP是Oracle数据库的逻辑备份工具,用于将整个数据库或部分对象从一个Oracle环境复制到另一个环境中。 ...

    Hibernate-add学习

    - **Oracle**: `org.hibernate.dialect.Oracle9Dialect` - **SQL Server**: `net.sf.hibernate.dialect.SQLServerDialect` - **connection.driver_class**: 数据库驱动类名,用于连接特定的数据库。 - **MySQL**...

Global site tag (gtag.js) - Google Analytics