我正在使用 Converter 类将复杂类存储为 MySQL 中的 JSON 文本。当我添加一个新实体时,Converter 类按预期工作。但是,当我更新实体时,复杂类中的数据不会在数据库中更新,而是在内存中更新。 Lat 和 Long 等其他属性已更新。我在 convertToDatabaseColumn 方法中放置的断点在更新时没有触发。
项目等级
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String city;
private String state;
private String country;
@Enumerated(EnumType.STRING)
private StatusType status;
private String street;
private double latitude;
private double longitude;
@Convert(converter=ProjectPropertyConverter.class)
private ProjectProperty property;
}
public class ProjectProperty {
private String description;
private List<String> projectImgs;
private Boolean hasImages;
}
属性转换器类
@Converter (autoApply=true)
public class ProjectPropertyConverter implements AttributeConverter<ProjectProperty, String> {
@Override
public String convertToDatabaseColumn(ProjectProperty prop) {
try {
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(prop);
return jsonString;
} catch (Exception e) {
System.out.print(e.toString());
return null;
}
}
@Override
public ProjectProperty convertToEntityAttribute(String jsonValue) {
try {
ObjectMapper mapper = new ObjectMapper();
ProjectProperty p = mapper.readValue(jsonValue, ProjectProperty.class);
if(p.getProjectImgs().isEmpty())
{
p.setHasImages(Boolean.FALSE);
}
else
{
p.setHasImages(Boolean.TRUE);
}
return p;
} catch (Exception e) {
System.out.print(e.toString());
return null;
}
}
}
更新数据库的方法
public void modifyEntity(Object entity, String query, HashMap params) {
try {
tx.begin();
em.flush();
tx.commit();
} catch (Exception e) {
e.toString();
}
}
最佳答案
我来这里寻找相同的答案。原来问题是 JPA 不知道你的对象是脏的。这是通过在这个复杂对象上实现 equals()/hashcode() 方法解决的。在您的示例中,为 ProjectProperty 实现 equals 和 hashcode
一旦完成,JPA 就能够通过这些方法识别底层对象是脏的并进行转换和持久化。
关于java - JPA 不使用 Converter 类更新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43011478/