我使用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 class和Data lost because of JPA AttributeConverter?),但我还没有找到答案。对于这种情况,是否有类似标准或最佳实践的东西?
FYI:对于CRUD操作,我使用Spring Data JpaRepository
类及其方法。
2条答案
按热度按时间o4tp2gmn1#
在Map值对象上实现适当的equals和hashcode方法,然后JPA可以使用这些方法来识别Map是脏的。
prdp8dxp2#
我也遇到过类似问题。我发现Hibernate使用了equals方法来确定某个属性是否脏,然后进行更新。
您有两个选择:为包含转换属性的实体正确实现equals方法
或
尝试使用“HashMap”作为属性类型,而不是使用“Map”。HashMap已经实现了equals方法,Hibernate将使用它