JPA 自动建表- @Id,@GeneratedValue 与 @GenericGenerator 设置主键生成策略
Posted abdusalam10
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPA 自动建表- @Id,@GeneratedValue 与 @GenericGenerator 设置主键生成策略相关的知识,希望对你有一定的参考价值。
@Id,@GeneratedValue 一起使用,设置主键生成策略为: 主键自增
注意:适用于MySql等具备主键自增功能的数据库,因为底层就是借用了MySql的主键自增功能1 @Entity 2 public class TblTest { 3 4 @Id 5 @GeneratedValue(strategy = GenerationType.IDENTITY) // 设置主键生成策略为:主键自增长,适用于mysql等部分数据库 6 private Integer id; 7 8 public Integer getId() { return id; } 9 public void setId(Integer id) { this.id = id; } 10 public TblTest() { } 11 }【建表语句】
CREATE TABLE `tbl_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`) )
@Id @GeneratedValue @GenericGenerator 一起使用,设置主键生成策略为: uuid
注意:该策略是Hibernate提供的1 @Entity 2 public class TblTest { 3 4 @Id 5 @GeneratedValue(generator = "myUuidGenerator") // 给主键生成策略起个名字,随意起名 6 @GenericGenerator(name = "myUuidGenerator", strategy = "uuid") // 设置主键生成策略为:uuid , 是 Hibernate 提供的 7 private String id; 8 9 public String getId() { return id; } 10 public void setId(String id) { this.id = id; } 11 public TblTest() { } 12 }【建表语句】
CREATE TABLE `tbl_test` ( `id` varchar(255) NOT NULL, PRIMARY KEY (`id`) )【测试:新增一条记录】save( new TblTest() );
@Id @GeneratedValue @GenericGenerator 一起使用,设置主键生成策略为: 自定义策略
1 import org.hibernate.annotations.GenericGenerator; 2 import org.hibernate.annotations.Parameter; 3 import javax.persistence.*; 4 5 @Entity 6 public class TblTest { 7 8 @Id 9 @GeneratedValue(generator = "myIdGenerator") // 给主键生成策略起个名字,随意起名 10 @GenericGenerator( 11 name = "myIdGenerator", // 策略名称,必须和上面的名称一致 12 strategy = "com.abdusalam.test.MyIdGenerator", // 自定义的主键生成类全名 13 parameters = {@Parameter(name="prefix", value="tblId_")} // 传递参数【 参数名:prefix 参数值:tblId_ 】【不需要传递参数时,可以不用 parameters 】 14 ) 15 private String id; 16 17 public String getId() { return id; } 18 public void setId(String id) { this.id = id; } 19 public TblTest() { } 20 }import org.hibernate.id.Configurable; import org.hibernate.id.IdentifierGenerator; // 自定义id生成策略的类 // IdentifierGenerator 接口提供 generate 方法:用来生成主键 // Configurable 接口提供 configure 方法:用来接收参数 public class MyIdGenerator implements Configurable,IdentifierGenerator { public String pre; @Override public void configure(Type type, Properties properties, ServiceRegistry serviceRegistry) throws MappingException { this.pre = properties.getProperty("prefix"); } @Override public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException { int random = new Random().nextInt(9000) + 1000; // 四位随机数: 5826 String timestamp = (System.currentTimeMillis()+"").substring(9); // 时间戳后四位: 7181 String id = this.pre + timestamp + random; // 最终生成的Id值:前缀_71815826 return id; } }【建表语句】 CREATE TABLE `tbl_test` ( `id` varchar(255) NOT NULL, PRIMARY KEY (`id`) )【测试:新增一条记录】save( new TblTest() );
重点:多个注解配合使用
以上代码看不懂?就看以下解释说明
/** * @javax.persistence.Id 声明该属性为主键,一个实体只能有一个属性被映射为主键 * * * @javax.persistence.GeneratedValue(strategy=GenerationType.AUTO,generator="xxx") 主键是自动生成策略,一般该注释和 @Id 一起使用 * strategy 四种取值 * GenerationType.AUTO 【默认值】生成方式取决于底层数据库 * GenerationType.IDENTITY 主键自增长,适用于MySQL等部分数据库 * GenerationType.TABLE 使用一个特定的数据库表格来保存主键 * GenerationType.SEQUENCE 在某些数据库中,不支持主键自增长, * 比如Oracle,Oracle 提供了一种叫做"序列(sequence)"的机制生成主键, * 要与@SequenceGenerator一起使用 * generator * 主键生成器的名字,与 @GenericGenerator 结合使用 * * * @org.hibernate.annotations.GenericGenerator 【Hibernate 所提供的】 ,与 @GeneratedValue 一起使用 * 举例 * @Id * @GeneratedValue(generator = "myGenerator") * @GenericGenerator(name="myGenerator",strategy = "uuid") // 这里的 uuid 是 Hibernate 所提供的主键生成策略 * private Integer Id; * 讲解 * @GeneratedValue 注解中的 generator 属性要与 @GenericGenerator 注解中 name 属性一致 * strategy 用来指定主键生成策略 * 策略名称可以是 Hibernate 提供的 13 种主键生成策略之一,也可以是自定义的主键生成策略类的全名 */
以上是关于JPA 自动建表- @Id,@GeneratedValue 与 @GenericGenerator 设置主键生成策略的主要内容,如果未能解决你的问题,请参考以下文章