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