项目需求,要求id改变1++的自增策略,而是使用自定义的varchar类型,长度定位24;
规则:
订单id : ord + 随机数+ 时间戳
渠道id : ch +随机数 +时间戳
等,可自行设置规则
工具类:
import java.util.Random;
public class IdUtil {
private static final Random _Rand = new Random();
private static final char[] _number = ("0123456789").toCharArray();
/**
* 获取指定位数数字
* @param length
* @return
*/
public static final String RandNum(int length){
String rand = "";
for(int i=0,s=_number.length;i<length;i++){
rand = rand + _number[_Rand.nextInt(s)];
}
return rand;
}
/**
* 生成user_id
* 根据等级规则
* @return
*/
public static final String getUid(int levelCode)
{
// UID + 00 + 13 = 18位
long time = System.currentTimeMillis();
return "UID"+(levelCode<10?"0":"")+levelCode+time;
}
/**
* 生成广告id,16位,ADV + time13
* @return
*/
public static final String getAdvId(){
long time = System.currentTimeMillis();
return "ADV"+time;
}
/**
* log记录id
* @return
*/
public static final String getLogId(){
long time = System.currentTimeMillis();
return "LOG" + time + RandNum(3);
}
}
hibernatePo设置
项目中集成hibernate映射, 因此,我们必须把其相对应的Po的主键生成策略注释掉;
@Id
//@GeneratedValue 主键生成策略
@Column(name = "id", unique = true, nullable = false)
public long getId() {
return id;
}
hibernateSave方法重载
在调用hibernate save对象前,调用工具类手动生成UUID,赋值到对象中,save即可;
这里是不同类型表,生成不同ID,更近instanceof 判断类型,而调用相对于的Id方法
public Serializable saveReturnIdByUUID(Object entity) {
/**
* XX表
*/
if(entity instanceof UserNamePo){
UserNamePo tempPo = (UserNamePo) entity;
tempPo.setUserId(IdUtil.getUid());
logger.info("手动生成id策略: 生成id值为:"+ tempPo.getUserId() );
return saveReturnId(tempPo);
}
/**
* XX表
*/
if(entity instanceof AdvertInfoPo){
AdvertInfoPo tempPo = (AdvertInfoPo) entity;
tempPo.setAdvId(IdUtil.getAdvId());
logger.info("手动生成id策略: 生成id值为:"+ tempPo.getAdvId() );
return saveReturnId(tempPo);
}
return null;
}