使用注解风格学习Hibernate和JPA的主键生成策略
主键是关系数据库中的一个基本概念,它用来保证记录的唯一性。简单来说,就是同一张数据库表中,不允许存在多条相同主键的记录。主键生成策略,就是当向数据库表中插入记录的时候,这个记录的主键该如何生成。绝大部分情况下,主键都是没有业务含义的,所以开发者不会、也不需要,显示地设置实体对象的主键值。但是对于数据库来说,主键是必须的,显然这个责任,落在了hibernate这个持久层框架上。对于初学hibernate的人来说,往往会被一堆的主键生成策略弄晕,本文介绍下一些容易混淆的概念,希望能帮助大家了解hibernate主键生成策略。
1.JPA和Hibernate的区别
2.JPA的4种策略介绍
- AUTO策略
- Sequence策略
- Identity策略
- Table策略
3.注解风格使用JPA主键生成策略
配置实体主键生成策略的时候,需要用到@GeneratedValue主键- 使用AUTO策略
public class Teacher { private int id; private String title; @Id @GeneratedValue(strategy = GenerationType.AUTO) public int getId() { return id; } }我使用的是mysql对应的数据库表如下:
注意:
- 使用sequence策略
public class Teacher { private int id; private String title; @Id @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="mySeqGenerator") @SequenceGenerator(name = "mySeqGenerator", sequenceName = "t_teacher_sequence", initialValue = 1000, allocationSize = 50) public int getId() { return id; } }这里需要配合使用@SequenceGenerator,用来指定序列的相关信息。
- 使用Identity策略
public class Teacher { private int id; private String title; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) public int getId() { return id; } }使用比较简单,这里不需要做详细介绍了
- 使用Table策略
public class Teacher { private int id; private String title; @Id @GeneratedValue(strategy = GenerationType.TABLE,generator="myTableGenerator") @TableGenerator(name = "myTableGenerator", table = "hibernateNeedTable", pkColumnName = "pk_key", valueColumnName = "pk_value", pkColumnValue = "teacherId", initialValue = 100, allocationSize = 1000) public int getId() { return id; } }不知道怎么用合适的语言来描述这些属性的含义。直接上图和执行的sql语句,读者只需要简单理解下,就能明白这些属性的含义了。
Hibernate: select pk_value from hibernateNeedTable where pk_key = ‘teacherId‘ for update Hibernate: update hibernateNeedTable set pk_value = ? where pk_value = ? and pk_key = ‘teacherId‘ Hibernate: insert into Teacher (title, id) values (?, ?)看到这里,大家应该明白了这些属性的用法了。值得一提的是,这个表可以给无数的表作为主键表,只是添加一条记录而以(需要保证table、pkColumnName、valueColumnName三个属性值唯一就可以了。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。