Hibernate 6.x中使用@JdbcTypeCode存储JSON对象报错求助
解决Hibernate 6 + Spanner JSON字段序列化/反序列化问题
1. 确认Spanner方言配置
确保application.yaml中配置了Hibernate 6兼容的Spanner方言:
spring: jpa: properties: hibernate: dialect: com.google.cloud.spanner.hibernate.SpannerDialect
2. 调整实体类字段注解
Hibernate 6已内置JSON类型支持,无需依赖旧版SpannerJsonType,按以下方式配置字段:
import jakarta.persistence.Column; import jakarta.persistence.Entity; import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.type.SqlTypes; @Entity public class YourEntity { @Column(name = "TemplateObj", columnDefinition = "JSON") @JdbcTypeCode(SqlTypes.JSON) private Template template; // 其他字段、构造函数、getter/setter }
注:
columnDefinition = "JSON"明确指定Spanner列类型为JSON,需确保数据库中该列类型配置正确。
3. 确保Template类可序列化
Template类需满足Jackson序列化要求:
- 提供无参构造函数(Jackson默认依赖)
- 字段有对应的getter/setter(或用Lombok的
@Data自动生成) - 嵌套实体类需遵循同样规则
示例Template类:
import lombok.Data; import java.util.List; @Data public class Template { private String name; private List<NestedItem> items; } @Data public class NestedItem { private Long id; private String content; }
4. 显式配置JSON序列化器
若默认序列化逻辑失效,可在application.yaml中指定Jackson作为JSON处理器:
spring: jpa: properties: hibernate: type: json: serializer: com.fasterxml.jackson.databind.ObjectMapper deserializer: com.fasterxml.jackson.databind.ObjectMapper
5. 验证数据库列类型
确认Spanner中TemplateObj列的类型为JSON(而非STRING),若之前是STRING类型,需修改列类型,否则会导致反序列化失败。
6. 测试验证
编写测试用例验证序列化/反序列化流程:
@Test void testJsonFieldPersistence() { Template template = new Template(); template.setName("Demo Template"); List<NestedItem> items = List.of(new NestedItem(1L, "test content")); template.setItems(items); YourEntity entity = new YourEntity(); entity.setTemplate(template); entityRepository.save(entity); YourEntity savedEntity = entityRepository.findById(entity.getId()).orElseThrow(); assert savedEntity.getTemplate() != null; assertEquals("Demo Template", savedEntity.getTemplate().getName()); assertEquals(1L, savedEntity.getTemplate().getItems().get(0).getId()); }
内容的提问来源于stack exchange,提问作者Tanushree B S
相关产品推荐
相关产品推荐

