java - JPA 不使用 Converter 类更新列

标签 java mysql jpa

我正在使用 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/

相关文章:

MySQL SELECT 与条件 NULL 列

java - 如何访问 ArrayList 中的 ArrayList? java

mysql:查找不同拼写的单词

java - Java中基于Request在后台运行servlet

mysql - Laravel 不正确的日期值 sql_mode 为空

java - Spring 4 hibernate 4 JPA LazyInitializationException : failed to lazily initialize a collection of role

java - 从实体生成表

java - JPA/eclipse-link 2.6.0/mysql : incorrect generated table name

java - 并行处理: class file has wrong version 49. 0,应该是48.0

Java : How to Avoid flickering on shape-made only animation (no image file)?