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

SpringBoot JPA中Typedef Repository无法正常工作问题排查

SpringBoot 2.7.6 JSONB存储功能停滞无异常问题

在SpringBoot 2.7.6版本应用中,有一张用于存储JSON值的表,但功能无法正常运行。代码调用Repository时停滞,无任何异常抛出。调试确认Repository已创建,但无法继续执行。相关依赖及代码如下:

依赖配置

<dependency>
    <groupId>com.vladmihalcea</groupId>
    <artifactId>hibernate-types-52</artifactId>
    <version>2.21.1</version>
</dependency>

实体类代码

@Entity
@Table(name = "ORDERSJSONB")
@Data
@AllArgsConstructor
@NoArgsConstructor
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class OrderInputEntity {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Column(name = "order_id")
    private String orderId;

    @Column(name = "country")
    private String country;

    @Column(name = "customer_type")
    private String customerType;

    @Column(name = "status")
    private Integer status;

    @Column(name = "order_items")
    @Type(type = "jsonb")
    private List<OrderItem> orderItems;
}

嵌套JSON对象类

@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
public class OrderItem implements Serializable {

    private BigDecimal cabinet;
    private BigDecimal sofa;
    private BigDecimal chairs;
    private BigDecimal tables;
}

数据库插入逻辑

// 插入数据库
orderInputRepository.deleteAll();
AtomicInteger x = new AtomicInteger(1);
orderInputMap.forEach((fileName, orderInput) -> {
        OrderInputEntity orderInputEntity = new OrderInputEntity();
        orderInputEntity.setId(x.get());
        orderInputEntity.setOrderId(orderInput.getOrderId());
        orderInputEntity.setCountry(orderInput.getCountry());
        orderInputEntity.setCustomerType(orderInput.getCustomerType());
        orderInputEntity.setStatus(orderInput.getStatus());
        orderInputEntity.setOrderItems(orderInput.getOrderItems());
        orderInputRepository.save(orderInputEntity);
        x.getAndIncrement();

});
System.out.println("JSON files inserted in Database...");

排查及解决方案

1. 数据库字段类型匹配

  • 确认ORDERSJSONB表的order_items字段类型为jsonb(仅PostgreSQL支持);若使用MySQL,需将字段类型改为json,同时实体类中改用JsonStringType替代JsonBinaryType
  • 验证@TypeDef配置是否被Hibernate正确识别,可通过Hibernate日志确认类型映射

2. 事务与批量操作优化

  • 当前循环调用save会频繁创建事务,可能导致连接池耗尽或超时:给插入逻辑所在方法添加@Transactional注解,将所有操作纳入同一事务
  • 改用批量插入API:orderInputRepository.saveAll(实体列表),减少数据库交互次数,提升性能并避免阻塞

3. 主键生成冲突

  • 实体类id字段配置了自动生成策略GenerationType.AUTO,但代码中手动设置了id值,会导致主键生成逻辑冲突:要么删除手动设置id的代码,让数据库自动生成;要么修改主键策略为IDENTITY,保持手动赋值逻辑一致

4. JSON序列化验证

  • 检查SpringBoot的Jackson配置,确保BigDecimal类型能正常序列化/反序列化;可给OrderItem的字段添加@JsonProperty注解明确映射关系
  • 确认OrderItem的序列化无循环引用或未知类型问题

5. 日志定位问题

  • 开启Hibernate SQL日志,查看执行停滞的具体环节:
    logging.level.org.hibernate.SQL=DEBUG
    logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
    
  • 查看数据库连接池日志,确认是否存在连接耗尽、超时或死锁情况

内容的提问来源于stack exchange,提问作者astar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:42:39