1

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

以下是只更新备注栏

@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();
        }
    }

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

我该如何解决这个问题?

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();
        }
    }
4

1 回答 1

1

在您的代码中,您正在合并一个具有所有null字段的新对象,除了remarks一个已经在数据库中持久存在的对象。这不是正确的方法:来自Hibernate参考手册:

更新实体实例状态的一种直接方法是 find() 它,然后在持久化上下文打开时直接对其进行操作:修改持久化对象

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

因此,您可以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();
        }
    }

这是加载对象的方法

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

@Override
    public Project load(Long id) {    
        return entityManager.find(Project.class, id);
    }
于 2013-07-25T12:37:11.097 回答