自己设置JPA主键生成策略实现保存时允许自己设置ID

作者 : 开心源码 本文共1215个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共151人阅读

适合场景

在使用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,同时保留原来的主键生成策略不变。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 自己设置JPA主键生成策略实现保存时允许自己设置ID

发表回复