JPA更新PostgreSQL表时String[]类型字段被更新为null问题求助
问题根因及修复方案
1. 自定义类型适配类逻辑与需求不匹配
你声明的是String[]类型字段适配类,但现有代码是针对Integer[]实现的,完全不兼容String数组,需要修改两处核心逻辑:
returnedClass方法返回值改为String[].classnullSafeSet方法中数组创建逻辑调整为String类型适配:
@Override public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) throws HibernateException, SQLException { if (value != null && st != null) { Array array = session.connection().createArrayOf("varchar", (String[])value); st.setArray(index, array); } else { st.setNull(index, sqlTypes()[0]); } }
2. UserType接口方法实现错误导致Hibernate状态判断异常
这是更新后字段为null的核心原因,需要逐个修正错误实现:
- 修正
deepCopy方法:原方法直接返回null,Hibernate拷贝属性时会直接覆盖你的字段值为null
@Override public Object deepCopy(Object o) throws HibernateException { if (o == null) return null; String[] original = (String[]) o; return Arrays.copyOf(original, original.length); }
- 修正
equals和hashCode方法:原方法固定返回false和0,会导致Hibernate脏检查失效,无法识别字段修改
@Override public boolean equals(Object o, Object o1) throws HibernateException { return Objects.equals(o, o1); } @Override public int hashCode(Object o) throws HibernateException { return o == null ? 0 : o.hashCode(); }
- 修改
isMutable返回值为true:数组是可变类型,原方法返回false会让Hibernate认为该字段值永远不会变化,不会触发更新逻辑 - 补充
disassemble、assemble、replace方法实现:原方法直接返回null会导致Hibernate序列化/反序列化实体时字段丢失
@Override public Serializable disassemble(Object o) throws HibernateException { return (Serializable) deepCopy(o); } @Override public Object assemble(Serializable serializable, Object o) throws HibernateException { return deepCopy(serializable); } @Override public Object replace(Object o, Object o1, Object o2) throws HibernateException { return deepCopy(o); }
3. 检查配置与映射逻辑
- 确认实体类对应字段上添加了类型绑定注解:
@Type(type = "你的CustomStringArrayType全类名") @Column(columnDefinition = "varchar[]") private String[] 对应字段名;
- 确认
ContactGroupMapper.updateInDB方法中,已经正确将DTO的String数组字段赋值到实体类对应字段,避免映射遗漏导致字段无值。
内容的提问来源于stack exchange,提问作者Sanjay Malhotra
相关产品推荐
相关产品推荐

