背景
- 开发过程中,可能需要自定义主键id的hibernate生成策略。例如:如果主键有指定值,则使用指定值;否则使用guid生成策略。针对这类自定义hibernate主键id的需求,可通过实现org.hibernate.id.IdentifierGenerator接口来实现
具体实现
- 实现IdentifierGenerator接口
- 由于上述需求是未指定时,使用guid策略。所以新的策略可直接继承GUIDGenerator进行逻辑处理。GUIDGenerator是IdentifierGenerator的实现类,所以SimpleUuidGenerator也是IdentifierGenerator的实现类
public class SimpleUuidGenerator extends GUIDGenerator {
@Override
public Serializable generate(SessionImplementor session, Object entity) throws HibernateException {
try {
Object id=PropertyUtils.getSimpleProperty(entity, "id");
if (id instanceof String) {
String idStringValue = (String) id;
if (StringUtils.isNotBlank(idStringValue)) {
return idStringValue;
}
}
} catch (Exception e) {
log.error("Error occured when get or set id value.", e);
}
return super.generate(session, entity);
}
}
- 使用@GeneratedValue和@GenericGenerator注解指定自定义id生成策略
- @GenericGenerator的strategy属性值使用SimpleUuidGenerator的全限定名
public class Entity {
@Id
@GeneratedValue(generator = "simple-uuid")
@GenericGenerator(name = "simple-uuid", strategy = "com.xxx.SimpleUuidGenerator")
private String id;
参考资料