为什么在JPA中保留清除表行中的现有数据?

时间:2014-03-10 22:56:09

标签: mysql jpa

我正在尝试使用JPA将数据更新到mySQL数据库。我没有问题持久化数据,但刷新将无法按预期工作。我检索登录会话的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";
    }
}

1 个答案:

答案 0 :(得分:2)

merge()持续所有实体的状态。不仅仅是非空字段。我不是,你会抱怨你想要将一些字段设置为null并且merge()忽略它并保持原样。

所以从数据库中获取一个实体并修改它,而不是只获取它的ID,从头开始创建一个新的实体实例,只设置它的一些字段。

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