jpa 根据主键生成策略获取id_自己设置JPA主键生成策略实现保存时允许自己设置ID...

当使用Spring Data JPA并希望主键来源于第三方系统时,可以实现IdentifierGenerator接口来自定义主键生成策略。通过扩展UUIDGenerator并覆盖generate方法,检查对象的id字段,如果已设置则返回,否则调用父类生成。这样既能保留默认行为,也能满足手动设定主键的需求。
摘要由CSDN通过智能技术生成

适合场景

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值