适合场景
在使用Spring Data JPA的时候,在使用UUID作为主键的时候,通常都会使用system-uuid作为主键生成策略,相似配置如下:@Id@GeneratedValue(strategy = GenerationType.AUTO, generator = "system-uuid")@GenericGenerator(name = "system-uuid", strategy = "uuid2")private String id;
我们都知道,使用save方法保存实体的时候JAP会根据主键判断是新添加(主键为空或者者数据库表中无该主键)还是升级(数据库表中有该主键)。
而且,在使用这种如上配置的时候无论实体的主键能否为空,只需在表中不存在,都会再次生成主键,也就是没办法通过给id属性赋值的形式来自己设置实体的id。
而在少量场景下,会有自己设置主键的需求,比方主键来源于其余第三方系统,这时候我们期望的还是使用第三方系统的主键作为主键以表示同一条数据,这就需要我们能够实现自己设置主键生成策略,并且JPA也提供了这样的通道。
自己设置主键生成策略
Spring Data JPA可以通过实现org.hibernate.id.IdentifierGenerator接口来自己设置主键生成器,而同时也提供了许多的内置生成器,就如上文中的system-uuid生成器,使用uuid2生成策略实现主键生成,也有实现自增的主键生成器:IncrementGenerator。
根据需求,可以通过继承org.hibernate.id.UUIDGenerator生成器来实现自己设置ID:/** * 自己设置UUID生成器 * @author sevenlin */public class CustomUUIDGenerator extends UUIDGenerator { @Override public Serializable generate(SessionImplementor session, Object object) throws HibernateException { Object id = FieldUtil.readField(object, "id"); if (id != null) { return (Serializable) id; } return super.generate(session, object); }}
有了自己设置主键生成器之后即可以通过如下配置指定该生成器:@Id@GeneratedValue(strategy = GenerationType.AUTO, generator = "custom-uuid")@GenericGenerator(name = "custom-uuid", strategy = "com.sevenlin.dal.CustomUUIDGenerator")private String id;
这样,即可以实现自己设置ID,同时保留原来的主键生成策略不变。