Hibernate使用JPA主键生成策略

来源:互联网 发布:淘宝刷差评多少钱一单 编辑:程序博客网 时间:2024/05/16 05:14

主键映射

当给持久化类定义一个标识属性时(对应数据表中的主键),可以使用@Id
可以使用@GeneratedValue修饰实体标识属性,也就是指定主键的生成策略。
@GeneratorValue的主要属性:
1. strategy: 主键生成策略,该属性有4个值,AUTOIDENTITYSEQUENCETABLE
- AUTO: 根据数据库的底层,自动选择IDENTITYSEQUENCETABLE
- IDENTITY: 自增长主键生成策略。IDENTITY适用于MySQLSql Server等数据库。用此策略时,省略 generator属性。
- SEQUENCE: 对于Oracle这样的数据库使用基于Sequence的主键生成策略。需要用@SequenceGenerator(之后写到)。
- TABLE: 使用辅助表来生成主键。与@TableGenerator一起使用(之后写到)。
2. generator: 生成器的名称。当strategy属性使用SEQUENCETABLE时,该属性使用他们定义的名字,也就是生成器的名称。

@SequenceGenerator生成器主要属性:
- name: 指定生成器的名字。可以在@GenratedValuegenerator中指定。
- allocationSize: sequenceName的大小。
- sequenceName: 数据库中sequence的名称。
- initialValue: 指定sequence的初始值。

@TableGenerator生成器主要属性:
- name: 指定生成器的名称。可以在@GeneratedValuegenerator属性指定。
- 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就是下一个插入数据的主键值。

0 0
原创粉丝点击