oracle sequence

1、先创建序列: 

CREATE SEQUENCE   emp_sequence--创建序列,名为:  emp_sequence

STARTWITH 1 --从1开始

MAXVALUE999999999 --最大值

INCREMENT BY 1 --每次递增 1

ORDER--排序

NOCYCLE;--避免重新开始,关闭循环

CACHE 10;

 

你就可以用CURRVAL,NEXTVAL

  CURRVAL=返回 sequence的当前值

  NEXTVAL=增加sequence的值,然后返回 sequence 值

  比如:

  emp_sequence.CURRVAL

  emp_sequence.NEXTVAL

2、hibernate 配置

2.1、hibernate 注释配置

 

@Entity(name = "users")  

@SequenceGenerator(name = "userSEQ", sequenceName = "emp_sequence")  

public class User {  

  

    private long uid;  

  

    @Id  

    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "userSEQ")  

    public long getUid() {  

        return uid;  

    }  

  

    public void setUid(long uid) {  

        this.uid = uid;  

    }  

}  

 

3.可以在 INSERT 语句的 values 子句中使用 NEXTVAL(或 CURRVAL),如以下示例中所示: 

INSERT INTO tab1 (col1, col2) 

   VALUES (seq_2.NEXTVAL, seq_2.NEXTVAL)

 

4假如在创建sequence时,有意不选用cache选项,有2点需要注意:

 

4.1. 访问效率降低,没有cache功能的sequence取值将无法直接访问内存

4.2. 不论是nocache还是cache , 每次访问nextval的过程都是不可逆的,在同一session中,在执行一系列dml和sequence的操作后,用户执行rollback,希望将操作回滚,但是sequence此时就显得异常顽固,用掉的nextval将无法被重现。当下一次试图读取nextval时,sequence的指针又移动到下一位了。

 

还有sequence不属于某个表,也不属于某个字段,sequence仅仅属于某个用户。

其实在创建了sequence后,每个表都可以使用这个sequence,但是这样会引起应用的很多麻烦,因此,建议每个表都使用一个sequence。

 

5.在oracle 中。

如果 用 native/auto 策略时

根据不同的数据库采用不同的ID生成方式,例如:在SQL Server中采用identity; 在MySQL中采用auto_increment; 在ORACLE中就会采用sequence, 注意hibernate会自动帮你创建一个名字叫hibernate_sequence的序列,不用自己去创建.这也是最常用和省事的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值