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
相关产品推荐
相关产品推荐

