Spring boot JPA 用自定义主键策略 没有就使用默认主键策略(有id使用已经有的,没有id就使用默认的主键策略)

一、导读

当我们保存实体类的时候,id默认都是系统自己生成的uuid,但是有时候我们需要使用我们自己的id,但是是用默认的生成id策略,即便是我们在实体类里面传了id,但是当我们保存的时候还是不会将这个id保存在数据库中,而是重新生成一个id。这时候我们就需要当我们传id的时候,保存就需要保存我们指定的这个id值。

二、方法

  1. 首先我们的实体类id应该是这样的:
	/**
     * 主键
     */
    @Id
    @Column(name = "ID")
    @GenericGenerator(name = "system-uuid", strategy = "uuid.hex")
    @GeneratedValue(generator = "system-uuid")
    private String id;

大体都是这样的,使用系统的uuid生成主键的策略。但是这种方式无法使用我们自己传的id。所以我们需要改造一下。

  1. 重写id生成策略方法 CustomUUIDGenerator类的写法
package com.fds.demo.entity;

import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.id.UUIDGenerator;

import java.io.Serializable;
import java.lang.reflect.Method;

/**
 * @author: fds
 * @date: 2019/8/12
 * @description: 生成自定义id Generator
 */
public class CustomUUIDGenerator extends UUIDGenerator {

    @Override
    public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
         Object id =  getFieldValueByName("id", object);
         if (id != null) {
             return (Serializable) id;
         }
         return super.generate(session, object);
    }

    private Object getFieldValueByName(String fieldName, Object o) {
        try {
            String firstLetter = fieldName.substring(0, 1).toUpperCase();
            String getter = "get" + firstLetter + fieldName.substring(1);
            Method method = o.getClass().getMethod(getter, new Class[] {});
            Object value = method.invoke(o, new Object[] {});
            return value;
        } catch (Exception e) {
            return null;
        }
    }
}
  1. 修改实体类的注解
	/**
     * 主键
     */
    @Id
    @Column(name = "ID")
    @GenericGenerator(name = "custom-id", strategy = "com.fds.demo.entity.CustomUUIDGenerator")
    @GeneratedValue(generator = "custom-id")
    private String id;

上面的com.fds.demo.entity.CustomUUIDGenerator必须要包的全类名

三、总结

使用上面的方法就可以实现实体类传id主键就保存你传的主键,如果不传id,就使用系统的uuid。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值