主键映射
当给持久化类定义一个标识属性时(对应数据表中的主键),可以使用@Id
。
可以使用@GeneratedValue
修饰实体标识属性,也就是指定主键的生成策略。
@GeneratorValue
的主要属性:
1. strategy
: 主键生成策略,该属性有4个值,AUTO
、IDENTITY
、SEQUENCE
、TABLE
。
- AUTO
: 根据数据库的底层,自动选择IDENTITY
、SEQUENCE
、TABLE
。
- IDENTITY
: 自增长主键生成策略。IDENTITY
适用于MySQL
、Sql Server
等数据库。用此策略时,省略 generator
属性。
- SEQUENCE
: 对于Oracle
这样的数据库使用基于Sequence
的主键生成策略。需要用@SequenceGenerator
(之后写到)。
- TABLE
: 使用辅助表来生成主键。与@TableGenerator
一起使用(之后写到)。
2. generator
: 生成器的名称。当strategy
属性使用SEQUENCE
、TABLE
时,该属性使用他们定义的名字,也就是生成器的名称。
@SequenceGenerator
生成器主要属性:
- name
: 指定生成器的名字。可以在@GenratedValue
的generator
中指定。
- allocationSize
: sequenceName
的大小。
- sequenceName
: 数据库中sequence
的名称。
- initialValue
: 指定sequence
的初始值。
@TableGenerator
生成器主要属性:
- name
: 指定生成器的名称。可以在@GeneratedValue
的generator
属性指定。
- table
: 指定辅助表的名称。
- initialValue
: 指定的整数值将作为辅助表的初始值。默认为0 。
- allocationSize
: 指定辅助表每次生成主键值的个数。举个例子,假设设置该值为5,那么每次插入一个数据,辅助表中的valueColumnName
所在列的主键值加上5,也就是说映射表中的新一行主键值会比上一个大5 。
- pkColumnName
: 指定存放主键名的列名。
- valueColumnName
: 指定存放主键值的列名。
- pkColumnValue
: 指定主键名。
使用TABLE
辅助表主键生成策略的例子:
@Entity
@Table(name = "person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "tab")
@TableGenerator(name = "tab" , table = "tab_person", allocationSize = 1,
pkColumnName = "pk_col", pkColumnValue = "pk_val", valueColumnName = "val_col")
private int myId;
private String name;
private int age;
```省略get、set方法```
}
这里指定辅助表为tab_person
,主键每次增加的大小为1,存放主键名的列名为pk_col
,存放主键值的列名为val_col
,主键列的主键名为pk_val
。
测试代码:
session.beginTransaction();
Person person = new Person();
person.setName("sweat");
person.setAge(21);
session.save(person);
session.getTransaction().commit();
数据库数据:
mysql> select * from tab_person;
+--------+---------+
| pk_col | val_col |
+--------+---------+
| pk_val | 2 |
+--------+---------+
1 row in set (0.00 sec)
mysql> select * from person;
+------+-----+-------+
| myId | age | name |
+------+-----+-------+
| 1 | 21 | sweat |
+------+-----+-------+
1 row in set (0.00 sec)
可以看到辅助表的pk_val
的数据为2,它是根据原始值1(也就是person
表中的主键myId
的值)加上allocationSize
后得到的。这里,2就是下一个插入数据的主键值。