Hibernate 5.6.1中已废弃的@TypeDef与@Type注解应替换为哪种非废弃用法?
解决Hibernate 5.6.1中JSON类型注解废弃的问题
嘿,我刚在项目里处理过一模一样的问题——升级到Hibernate 5.6.x后,旧的JSON类型注解全飘废弃警告,刚好踩过坑,给你分享几个靠谱的替换方案:
字段级注解替换
原来你用的@Type(type = "json")可以直接换成两种非废弃写法:
方式1:直接指定具体的类型类
这种写法最直接,完全兼容现有逻辑,不会有任何警告:
import com.vladmihalcea.hibernate.type.json.JsonBinaryType; import org.hibernate.annotations.Type; // 替换原来的@Type(type = "json") @Type(JsonBinaryType.class) private JsonNode yourJsonField;
方式2:使用类型安全的@JdbcTypeCode(推荐)
Hibernate 5.6引入了@JdbcTypeCode注解,这是更贴合未来Hibernate 6.0类型系统的写法,类型安全且语义更清晰,前提是你的数据库原生支持JSON类型(比如PostgreSQL、MySQL 8+、SQL Server 2016+等):
import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; @JdbcTypeCode(SqlTypes.JSON) private JsonNode yourJsonField;
全局类型注册替换(对应原来的@TypeDef)
如果你之前用@TypeDef全局注册了JSON类型别名,现在可以换成@TypeRegistration注解来实现全局绑定:
包级全局注册
在你的实体类所在包下创建一个package-info.java文件,写入以下内容:
@TypeRegistration(type = JsonBinaryType.class, defaultForType = JsonNode.class) package com.your.project.entity; import com.vladmihalcea.hibernate.type.json.JsonBinaryType; import org.hibernate.annotations.TypeRegistration; import com.fasterxml.jackson.databind.JsonNode;
这样所有JsonNode类型的字段都会自动使用JsonBinaryType处理,不用再每个字段加注解。
Spring Boot配置类注册
如果是Spring Boot项目,也可以通过配置类手动注册类型:
import com.vladmihalcea.hibernate.type.json.JsonBinaryType; import org.hibernate.boot.model.TypeContributions; import org.hibernate.service.ServiceRegistry; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class HibernateTypeConfig { @Bean public org.hibernate.type.spi.TypeContributor jsonTypeContributor() { return (TypeContributions typeContributions, ServiceRegistry serviceRegistry) -> { // 注册JsonBinaryType,并保留原来的"json"别名(如果需要兼容旧代码) typeContributions.contributeType(JsonBinaryType.INSTANCE, "json"); }; } }
这些方案都是Hibernate 5.6官方支持的非废弃用法,完全符合你的质量规范要求,同时也能平滑过渡到未来的Hibernate 6.0版本。
内容的提问来源于stack exchange,提问作者Crystark
相关产品推荐
相关产品推荐

