Note to self: Don’t forget to annotate complex fiels with the @Mutable annotation.
It might sound noobish, but i’ve just spend the last 2 hours trying to find out why my jpa/eclilpse link entity wasn ‘t updating my ‘complex’ (hashmap) field. At first, i figured it had something to do with the @Converter i was using to serialize/deserialize the HashMap into a JSON string. But eventually it turned out, that the change-tracking mechanism only works for non-mutable/basic fields. And thus, no updates were detected, as i was updating the hashmap, instead of replacing it.
So as it turns out (i should have read the manual ;)) the @Mutable annotation is there to use.
@Entity
public class BasicEntity {
@Id
@GeneratedValue
private int id;
@JsonAdapter(BasicEntityTypeAdapter.class)
private BasicEntityType type;
private String location;
private float x;
private float y;
@Convert(converter = JPAHashmapToStringConverter.class) /*store as String/json*/
@Column(length=4096)
@Mutable
private HashMap<String, Object> properties;
}
@Converter
public class JPAHashmapToStringConverter implements AttributeConverter<HashMap<String, Object>,String>{
private final static Gson gson = new Gson();
private final static Class hashMapClass = new HashMap<String,Object> ().getClass();
@Override
public String convertToDatabaseColumn(HashMap<String, Object> meta) {
if (meta==null)meta = new HashMap<String,Object>();
return gson.toJson(meta);
}
@Override
public HashMap<String, Object> convertToEntityAttribute(String dbData) {
return gson.fromJson(dbData,hashMapClass);
}
}