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的序列,不用自己去创建.这也是最常用和省事的.

猜你喜欢

转载自dbp5588.iteye.com/blog/2280555