hibernate - 自定义id生成策略IdentifierGenerator

1,544 阅读1分钟

背景

  • 开发过程中,可能需要自定义主键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 {
        //如果主键有值,则用实体自带的主键值;否则使用guid生成策略
        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
     */
    @Id
    @GeneratedValue(generator = "simple-uuid")
    @GenericGenerator(name = "simple-uuid", strategy = "com.xxx.SimpleUuidGenerator")
    private String id;

参考资料