Hibernate使用JPA主键生成策略

主键映射

当给持久化类定义一个标识属性时(对应数据表中的主键),可以使用@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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值