数据表的数据来源有两种情况的适用,如:1,通过接口(自带主键)新增,2,本系统新增;
原理:就是保存数据之前先判断 是否有ID有,则直接用,没有再生成;
import java.io.Serializable;
import org.hibernate.MappingException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.UUIDGenerator;
public class CustomUUIDGenerator extends UUIDGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object) throws MappingException {
Serializable id = IdHelper.getId(object);
if (id != null && !"".equals(id)) {
return id;
}
return super.generate(session, object); //这里也可以改成自己的UUID生成方法;
}
}
import com.alibaba.fastjson.JSONObject;
public class IdHelper {
/**
* 从对象中获取主键(id)字段
* @Time 2020年6月11日 下午7:25:10
* @param obj
* @return
*/
public static Serializable getId(Object obj) {
if(obj != null) {
JSONObject json = (JSONObject) JSONObject.toJSON(obj);
return json.getString("id");
}
return null;
}
}
实体中主键上的注解配置如下:
注意:generator = “custom-uuid” 一定要和 @GenericGenerator 中的name值相同
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "custom-uuid")
@GenericGenerator(name = "custom-uuid", strategy = "com.sgcc.sys.common.utils.CustomUUIDGenerator")
@Column(name = "ID", nullable = false, length = 64)
private String id;