0%

Hibernate-主键自增

javax.persistence@GeneratedValue注解为主键提供了指定的生成策略。在Oracle中使用Sequence序列实现自增,MySQL中使用AUTO_INCREMENT属性生成唯一的标识符。

Oracle中的序列

使用序列自动生成主键值

创建序列

创建序列的语句如下:

1
2
3
4
5
CREATE SEQUENCE customers_seq
START WITH 1000
INCREMENT BY 1
NOCACHE
NOCYCLE;
  • CREATE SEQUENCE:创建一个序列
  • START WITH:指定第一个将要生成序列的值。对于递增序列,默认值是序列的最小值;对于递减序列,默认值是最大值。
  • INCREMENT BY:指定序列号之间的间隔,可以是任何正整数或负整数,但不会是0。如果是正整数则为递增序列;如果是负整数则为递减序列。如果省略这个子句,则为默认值1。
  • NOCACHE:不缓存
  • NOCYCLE:不循环自增,在达到最大值或最小值后,不能再生成。

序列的伪列

  • CURRVAL:返回当前序列值
  • NEXTVAL:增加序列并返回下一个值

使用时需要跟在特定序列名后:

1
2
customers_seq.CURRVAL
customers_seq.NEXTVAL

使用示例如下:

1
INSERT INTO T_CORE_CONFIG(ID, NAME, CATEGORY) VALUES (customers_seq.NEXTVAL, '下拉列表配置', 'select-config');

查看所有序列

1
select * from user_sequences;

删除序列

1
DROP  SEQUENCE customers_seq;

对应实体类配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Entity(name = "Product")
public static class Product {

@Id
@GeneratedValue(
strategy = GenerationType.SEQUENCE,
generator = "sequence-generator"
)
@SequenceGenerator(
name = "sequence-generator",
sequenceName = "product_sequence",
allocationSize = 1
)
private Long id;

@Column(name = "product_name")
private String name;

}

Mysql中的自增(AUTO_INCREMENT)

使用AUTO_INCREMENT属性为新增行生成唯一标识符。

创建

创建语句如下:

1
2
3
4
5
create table `mail_detail` (
id int not null auto_increment,
name CHAR(30) not null,
primary key (`id`)
);

新增

新增语句如下:

1
alter table T_EDF_TASK modify taskId int(19) not null auto_increment;

对应实体类配置

1
2
3
4
5
6
7
8
9
10
11
@Entity(name = "Product")
public static class Product {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "product_name")
private String name;

}

参考资料