如何仅限制我想要在数据库表中更新的那些列而不是更新表的所有列?
以下是仅更新备注列
@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();
}
}
答案 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();
}
}
在DAO
中,您需要一种加载对象的方法,例如:
@Override
public Project load(Long id) {
return entityManager.find(Project.class, id);
}