mysql - 为什么JPA中的persist会清除表行中的现有数据?

标签 mysql jpa

我正在尝试使用 JPA 将数据更新到 mySQL 数据库。我在保留数据方面没有问题,但刷新不会按预期工作。我检索登录 session 的 id,设置该 id(它是主键)以及设置我想要合并到数据库的描述字段。我通过这个方法逐行调试,所有变量都包含预期值。如有任何解决此问题的想法或建议,我们将不胜感激。

    public String update() {
    factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    EntityManager em = factory.createEntityManager();   


    if(true){
        em.getTransaction().begin();

        String sessionEmail=Util.getEmail();
        //Create query to find user passwords matching the inputted name
        Query myQuery = em.createQuery("SELECT u FROM BusinessAccount u WHERE u.email=:email");
        myQuery.setParameter("email", sessionEmail);
        List<BusinessAccount> accounts=myQuery.getResultList();
        int intId=accounts.get(0).getId();
        businessAccount.setId(intId);
        String des=businessAccount.getDescription();
        businessAccount.setDescription(des);
        em.flush();
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO,
                "User Registration Successful!", null));
        return "success";
    } 

    else {
        addMessage(new FacesMessage(FacesMessage.SEVERITY_ERROR,
                "User Registration Failed!", null));
        return "failure";
    }
}

最佳答案

merge() 保留实体的所有状态。不仅仅是非空字段。如果不是,您会提示您想将某些字段设置为 null,而 merge() 会忽略它并保持原样。

因此,从数据库中获取一个实体并对其进行修改,而不是仅获取其 ID,从头开始创建一个新的实体实例并仅设置其部分字段。

请注意,如果您获取实体并在单个事务中修改它,您甚至不必调用 merge():新状态将自动持久化。

关于mysql - 为什么JPA中的persist会清除表行中的现有数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22313119/

相关文章:

mysql - Sequelize 模型中的自动填充字段?

mysql - 如何使用sequelize和mysql设置默认值?

java - JPA : EntityManager is taking too long to save the data

java - 为什么事务在 Spring JPA 中没有回滚到所需的传播级别?

java - JUnit Eclipse JPA persistence.xml 未找到

java - 如何在运行时检索 JPA 中实体的映射表名称?

mysql - 如何在 Fedora 20 中安装 MySQL?

mysql - 显示来自 get_lock 的所有当前锁

java - mySQL数据库结构

java - 如何使用或注释不应保留在数据库中的 JPA 实体 bean 中的虚拟字段