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

Java11升级Java17+SpringBoot3+Hibernate6保存对象NPE问题求助

解决方案

1. 移除错误的@Converts注解

实体类上的@Converts配置完全无效:attributeName指定的"int-array"、"string-array"与实际字段名intvalues、content不匹配,且和@JdbcTypeCode注解冲突,直接删除该注解。

2. 修正数组字段的类型配置(二选一)

方式A:使用Hypersistence Utils自定义类型(推荐)

你已引入io.hypersistence:hypersistence-utils-hibernate-62依赖,直接用它适配PostgreSQL数组类型:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
@Table(name = "mapping")
// 移除原@Converts注解
public class Mapping {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(columnDefinition = "serial")
    private Long id;

    @Column(name = "name_id")
    private String nameID;

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

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

    @Type(IntArrayType.class)
    @Column(name = "intvalues", columnDefinition = "integer[]")
    private Integer[] intvalues;

    @Type(StringArrayType.class)
    @Column(name = "content", columnDefinition = "text[]")
    private String[] content;

    @Column(name = "relevance_id")
    private Integer relevanceId;
}

方式B:使用Hibernate原生配置

若不想依赖Hypersistence Utils,调整字段注解并确保方言适配:

// ... 其他字段不变
@Basic
@JdbcTypeCode(SqlTypes.ARRAY)
@Column(name = "intvalues", columnDefinition = "integer[]")
@Type(value = org.hibernate.type.ArrayType.class)
private Integer[] intvalues;

@Basic
@JdbcTypeCode(SqlTypes.ARRAY)
@Column(name = "content", columnDefinition = "text[]")
@Type(value = org.hibernate.type.ArrayType.class)
private String[] content;
// ... 其他字段不变

3. 修正保存代码的setter调用错误

实体类字段intvalues对应的Lombok setter方法是setIntvalues(小写v),你当前写的setIntValues(大写V)会导致字段未赋值,修正为:

mapping.setIntvalues(intArr); // 对应字段intvalues的正确setter

4. 优化Hibernate方言配置

Hibernate 6+推荐使用对应PostgreSQL版本的方言,例如PostgreSQL 15版本:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL15Dialect

不确定版本的话,保留PostgreSQLDialect也可,但指定具体版本能更好适配新特性。

5. 清理并重启应用

删除编译生成的target/build目录,重新编译构建,确保所有配置生效。


原因分析

  • 错误的@Converts注解:属性名与实际字段不匹配,导致Hibernate尝试处理不存在的属性,触发类型解析异常。
  • 注解冲突:同时使用@JdbcTypeCode和不匹配的@Convert,导致Hibernate类型注册表无法找到对应的DdlType,引发空指针。
  • setter调用错误:虽不是本次NPE的直接原因,但会导致字段未赋值,需修正避免后续问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:04:53