You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:22:25