如何在更新表的特定列时限制更新其他列数据

时间:2013-07-25 12:29:16

标签: hibernate jpa jpa-2.0

如何仅限制我想要在数据库表中更新的那些列而不是更新表的所有列?

以下是仅更新备注列

@Test
    public void updateProject() {
        try {
            Project project = new Project();
            project.setProjectId(234L);
            project.setRemarks("from junit");
            projectService.update(project);
        } catch (Exception e) {
            System.out.println("error" + e.getMessage());
            e.printStackTrace();
        }
    }

当我执行上面的操作时,它更新了表中的所有其他列,因此这会使所有其他列值为null。

如何解决此问题?

DAOImpl代码

@Override
    public void update(project project) {    
        entityManager.merge(project);
        entityManager.flush();      
    }

更新1 修改后的代码

@Test
    public void updateProject() {
        try {
            Project project = new Project();
            project = projectService.load(234L);            
            project.setRemarks("from junit");
            projectService.update(project);
        } catch (Exception e) {
            System.out.println("error" + e.getMessage());
            e.printStackTrace();
        }
    }

1 个答案:

答案 0 :(得分:1)

在您的代码中,您将新对象与除null之外的所有remarks字段合并,并且对象已在db中持久存在。这不是正确的方法:来自Hibernate参考手册:

  

更新实体实例状态的直接方法是   find()它,然后直接操纵它,同时持久化   上下文是开放的:Modifying persistent objects

如果您需要修改持久对象,首先必须加载它,然后只编辑需要更新的字段,然后保存它。

因此,您只需从数据库加载Project实体,只更新您需要的字段,然后save()save()实际上不是必需的,因为Hibernate检查对象是否被修改并自动保存。

@Test
    public void updateProject() {
        try {
            // Load the project entity from the DB using it's id 234L
            project.setRemarks("from junit");
            projectService.save(project);
        } catch (Exception e) {
            System.out.println("error" + e.getMessage());
            e.printStackTrace();
        }
    }

这是how load an object

DAO中,您需要一种加载对象的方法,例如:

@Override
    public Project load(Long id) {    
        return entityManager.find(Project.class, id);
    }