JPA:休眠:无法使用Converter类更新列

hrirmatl  于 2022-12-13  发布在  其他
关注(0)|答案(2)|浏览(168)

我使用Converter类将我的实体字段(类型为Map<String, Object>)作为JSON文本存储在MySql DB中:

@Entity
@Table(name = "some_table")
public class SomeEntity {
    ...

    @Column(name = "meta_data", nullable = false)
    @Convert(converter = MetaDataConverter.class)
    Map<String, Object> metaData = null;
    ...
}

下面是MetaDataConverter类:

@Converter
public class MetaDataConverter implements AttributeConverter<Map<String, Object>, String> {

    private final ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(Map<String, Object> metadata) {
        try {
            return objectMapper.writeValueAsString(metadata);
        } catch (Exception e) {
            ...
        }
    }

    @Override
    public Map<String, Object> convertToEntityAttribute(String dbData) {
        try {
            return objectMapper.readValue(dbData, Map.class);
        } catch (Exception e) {
            ...
        }
    }
}

下面是我的服务类:

@Service
@RequiredArgsConstructor
@Transactional
public class MetaDataService {

    private final JpaRepository<MetaDataEntity, String> metaDataRepository;

    public MetaDataEntity updateOnlyMetadata(String someParameter, Map<String, Object> newMetaData) {
        MetaDataEntity metaDataEntity = metaDataRepository.findBySomeParameter(someParameter);
        metaDataEntity.setMetaData(newMetaData);
        return metaDataRepository.save(metaDataEntity);
    }
}

对于创建,它工作正常,但它不工作与转换字段的更新。如果我试图更新metaData字段,数据库中的相应列没有更新。但是,metaData是更新的情况下,其他实体字段。
我已经看到了同样的问题(JPA not updating column with Converter classData lost because of JPA AttributeConverter?),但我还没有找到答案。对于这种情况,是否有类似标准或最佳实践的东西?
FYI:对于CRUD操作,我使用Spring Data JpaRepository类及其方法。

o4tp2gmn

o4tp2gmn1#

在Map值对象上实现适当的equals和hashcode方法,然后JPA可以使用这些方法来识别Map是脏的。

prdp8dxp

prdp8dxp2#

我也遇到过类似问题。我发现Hibernate使用了equals方法来确定某个属性是否脏,然后进行更新。
您有两个选择:为包含转换属性的实体正确实现equals方法

尝试使用“HashMap”作为属性类型,而不是使用“Map”。HashMap已经实现了equals方法,Hibernate将使用它

相关问题