先说下自己创建uuid的好处,就是可以自己指定id,自己不指定的时候自己生成,更加灵活,而默认的是声明以后,自己再传进去的id就会被忽略。
默认的注解生成方式如下:
java
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID",strategy = "org.hibernate.id.UUIDGenerator")
@Column(name = COLUMN_ID_NAME, nullable = false)
public String getId() {
return id;
}
下面是自己继承重写:
java
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.UUIDGenerator;
import org.hibernate.id.uuid.StandardRandomStrategy;
import org.hibernate.type.descriptor.java.UUIDTypeDescriptor;
import java.io.Serializable;
import java.lang.reflect.Field;
/***
* 自定义的主键生成器,替代org.hibernate.id.UUIDGenerator
* 可以实现自己设置uuid时采用自己设置的,不设置使用默认的
* @author yishuo
* @date 2023/11/26 4:52:16
*/
public class MyUUIDUtil extends UUIDGenerator {
@Override
public Serializable generate(SharedSessionContractImplementor session, Object obj) {
try {
Field field = obj.getClass().getDeclaredField("id");
field.setAccessible(true);
String id = (String) field.get(obj);
if (id!=null) {
return id.substring(0,32);
}
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
return UUIDTypeDescriptor.ToStringTransformer.INSTANCE.transform( StandardRandomStrategy.INSTANCE.generateUUID( session ) ).replace("-","");
}
}
我是存的32长度的id,所以把"-"去掉了,采用这种方式不会警告:does not generate IETF RFC 4122 compliant UUID values
使用自己重写的UUID协议,也类似上面,如下:
java
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID",strategy = "com.yishuo.xst.util.MyUUIDUtil")
@Column(name = COLUMN_ID_NAME, nullable = false)
public String getId() {
return id;
}