2016-02-18 27 views
0

堆栈搜索,但没有找到答案。我有几个文本框的子页面,当我编辑的数据字​​段插件发送回复到我的控制器:X-editable插件和Spring MVC - 更新实体的最佳方式

@RequestMapping(value = "/myAcc", method = RequestMethod.POST) 
    public String getValues(@ModelAttribute XEditableForm form){ 
     userService.update(form.getPk(), form.getValue()); 
     return "myAcc"; 
    } 

其中userService使用户更新的数据库

@Transactional 
public void update(long id, String firstName){ 
    User user= userRepository.findOne(id); 
    user.setFirstName(firstName); 
    userRepository.save(user); 
} 

的问题是,每次在这种方法中,我会检查xeditable插件返回的内容,并更新特定的用户字段,例如姓氏等。在我看来,这不是最好的解决方案。

XEditableForm回报:

pk - primary key of record to be updated (ID in db) 
name - name of field to be updated (column in db) 
value - new value 

问题要问你。我怎样才能做得更好?

+0

这取决于。如果它只是一个提交按钮,那没有任何开销。如果您希望每次按键都立即反映数据库的表单更改,我建议仅在自上次按键后几秒钟后发送请求,或者查找某个事件,告知您已完成并发送数据。如果不需要在数据库中保存立即更改,则可以更新模型属性/分离实体/ smth else,并在稍后保留或合并它。 –

+0

我认为我的解释不完整。这个想法是用户可以改变几个字段的值。每次更改后,用户对象都会在数据库中更新。所以现在我不得不写一些方法来检测每个领域的变化。如果用户只更改姓氏,我必须检查其他字段并只更新非空字段。 我问是否有任何方法通过创建一个对象来概括这个例子,然后更新它。你在这里提到关于合并。您可以展示它在JPARepository接口中的外观示例吗? – Adamo

回答

0

我会为自己回答。在这种情况下,我们可以使用

org.springframework.utilClass ReflectionUtils 

〔实施例使用的:

User user = userRepository.findOne(id); 
Field name = ReflectionUtils.findField(User.class, "name"); 
ReflectionUtils.makeAccessible(true); 
name.set(user, "Admin"); 

通过这种方式,你可以编辑类中的字段知道他们的名字。这就是我的意思。

+0

@georgy gobozov你可以看看吗? – Adamo