一、导读
当我们保存实体类的时候,id默认都是系统自己生成的uuid,但是有时候我们需要使用我们自己的id,但是是用默认的生成id策略,即便是我们在实体类里面传了id,但是当我们保存的时候还是不会将这个id保存在数据库中,而是重新生成一个id。这时候我们就需要当我们传id的时候,保存就需要保存我们指定的这个id值。
二、方法
- 首先我们的实体类id应该是这样的:
/**
* 主键
*/
@Id
@Column(name = "ID")
@GenericGenerator(name = "system-uuid", strategy = "uuid.hex")
@GeneratedValue(generator = "system-uuid")
private String id;
大体都是这样的,使用系统的uuid生成主键的策略。但是这种方式无法使用我们自己传的id。所以我们需要改造一下。
- 重写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;
}
}
}
- 修改实体类的注解
/**
* 主键
*/
@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。