最近学习Spring boot JPA 学习过程解决的一些问题写成随笔,大家一起成长。
这次遇到自定义主键的问题
package javax.persistence; public enum GenerationType {
TABLE,
SEQUENCE,
IDENTITY,
AUTO; private GenerationType() {
}
}
GenerationType源码
从源码中可以看出JPA提供的四种标准主键策略TABLE,SEQUENCE,IDENTITY,AUTO
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)。
IDENTITY:主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)
AUTO:主键由程序控制,也是GenerationType的默认值。
不写GeneratedValue注解时即为GenerationType.AUTO 这时主键生成是根据数据库hibernate_sequence里的next_val来生成但我想用自已规则来生成自己的ID查了半天的资料终于解决这个问题。
自定义生成的ID,看到效果出来那个兴奋啊,新手对java的一堆注解还是真的不容易上手。
下面是具体代码
1.在实体主键get方法添加注解
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "custom-id") @GenericGenerator(name = "custom-id", strategy = "com.muyuer.springdemo.core.CustomIDGenerator")
@Column(name = "user_id")
public Long getUserId() {
return userId;
}
注意:GeneratedValue中的generator要与GenericGenerator中的name相等 上面代码中是"custom-id"
2.添加自定义ID生成类
package com.muyuer.springdemo.core; import com.muyuer.springdemo.utils.SnowflakeIdHelper;
import org.hibernate.MappingException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentityGenerator;
import java.io.Serializable; /**
* 自定义ID生成器
* @author muyuer 182443947@qq.com
* @version 1.0
* @date 2018-12-08 15:42
*/
public class CustomIDGenerator extends IdentityGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object) throws MappingException {
Object id = SnowflakeIdHelper.getId();
if (id != null) {
return (Serializable) id;
}
return super.generate(session, object);
}
}
这里Override了generate方法通过SnowflakeIdHelper.getId();返回了自定义的ID。
注意:我测试的ID是Long类型所以这里继承的是IdentityGenerator类,如果ID为String类型的话应该继承 UUIDGenerator 或者 UUIDGenerator