Hibernate 6自定义序列式ID生成器适配:LongType弃用解决方案
Hibernate 6 自定义序列式ID生成器实现(解决LongType弃用问题)
Hibernate 6 中org.hibernate.type.LongType已被移除,导致原Hibernate 5版本的自定义序列ID生成器报错。以下是适配Hibernate 6的实现方案:
修改后的代码实现
import org.hibernate.HibernateException; import org.hibernate.MappingException; import org.hibernate.boot.model.TypeConfiguration; import org.hibernate.id.enhanced.SequenceStyleGenerator; import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.service.ServiceRegistry; import org.hibernate.type.BasicType; import org.hibernate.type.Type; import org.hibernate.type.spi.SharedSessionContractImplementor; import java.io.Serializable; import java.util.Properties; public class StringPrefixedSequenceIdGenerator extends SequenceStyleGenerator { public static final String VALUE_PREFIX_PARAMETER = "valuePrefix"; public static final String VALUE_PREFIX_DEFAULT = ""; private String valuePrefix; public static final String NUMBER_FORMAT_PARAMETER = "numberFormat"; public static final String NUMBER_FORMAT_DEFAULT = "%d"; private String numberFormat; @Override public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException { Long sequenceValue = (Long) super.generate(session, object); return valuePrefix + String.format(numberFormat, sequenceValue); } @Override public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException { // 从TypeConfiguration中获取Long类型,替代已弃用的LongType.INSTANCE TypeConfiguration typeConfiguration = serviceRegistry.getService(TypeConfiguration.class); Type longType = typeConfiguration.getBasicTypeRegistry().resolve(BasicType.LONG); super.configure(longType, params, serviceRegistry); valuePrefix = ConfigurationHelper.getString(VALUE_PREFIX_PARAMETER, params, VALUE_PREFIX_DEFAULT); numberFormat = ConfigurationHelper.getString(NUMBER_FORMAT_PARAMETER, params, NUMBER_FORMAT_DEFAULT); } }
关键改动说明
- 替换弃用类型:通过
TypeConfiguration的基础类型注册表获取Long类型实例,适配Hibernate 6的类型体系变化,替代原LongType.INSTANCE。 - 明确类型转换:在
generate方法中显式将父类返回值转为Long,避免隐式转换带来的类型风险,符合序列生成的数值特性。 - 保留业务逻辑:完整保留原有的前缀配置、数字格式化逻辑,确保业务行为与Hibernate 5版本一致。
实体类注解用法(与Hibernate 5兼容)
在实体类的ID字段上使用Hibernate扩展注解配置生成器:
import jakarta.persistence.Id; import jakarta.persistence.GeneratedValue; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; @Id @GenericGenerator( name = "prefix_sequence", strategy = "com.example.StringPrefixedSequenceIdGenerator", parameters = { @Parameter(name = "sequence_name", value = "entity_seq"), @Parameter(name = "valuePrefix", value = "ENT_"), @Parameter(name = "numberFormat", value = "%05d") } ) @GeneratedValue(generator = "prefix_sequence") private String id;
内容的提问来源于stack exchange,提问作者NAVEEN NAVEEN
相关产品推荐
相关产品推荐

