使用spring处理请求/响应中的非表单字段的正确方法?

时间:2013-03-01 12:46:46

标签: java spring hibernate spring-mvc

我有一个基于Hibernate的模型对象,例如十个字段。我需要将其中六个传递给一个Spring表单并将它们取回,但其他四个不需要进行往返表单。但是,当Hibernate对象保存在数据库中时,他们需要坚持更新/创建。如果我不需要,我宁愿不将它们作为隐藏字段放在表单上,​​其中一些可能具有敏感数据。

最好的方法是什么?我在网上寻找解决方案,但信息/示例相当稀疏。

我一直在玩Hibernate POJO的实例作为请求范围的Spring bean,但我似乎无法使语法正确。

4 个答案:

答案 0 :(得分:1)

我的方法是单独的表格支持对象。

的内容
public class ModelForm {
    //required fields

    public ModelForm(Model model){
        //set the values from model
    }

    //getters and setters

    public void update(Model model){
        //set values back to the model
    }
}

public class ModelController {
    public <return-type> submit(@ModelAttribute ModelForm form) {
        Model model = loadModel(form);//Load the model object from DB using a id or some other property
        form.update(model);
        //other logic
        save(model);
    }
}

答案 1 :(得分:1)

仅使用六个字段创建基本DTO,然后使用返回的反序列化数据更新实体。

或者简单地序列化整个hibernate enitity,然后反序列化并合并。

直到你真的如同四个领域制造圆形的整体将真的没有太大的区别。更可能的安全性将成为一个问题。

在我的应用程序中,我设置了许多转换服务来自动化实体的反序列化。

DTO在向多个不同实体展示数据以用于一种形式时非常有用。

不要创建一个请求范围的bean,这太过分了。四个未使用的字段将保持不变,它们将保存在数据库中/存储在任何hibernate cach中。

在优化之前担心你的api设计

答案 2 :(得分:0)

如果模型的所有属性都没有发送到弹簧前端(形式为隐藏),您将丢失数据,除非您将其保存在某处(会话,静态地图,数据库)这可能是一项代价高昂的操作。如果不想两次命中数据库,请输入一个staticMap,其中Key为用户和对象id,并为旧对象赋值。

答案 3 :(得分:0)

如何在Hibernate中为该实体设置second level cache,以便在使用从UI接收的属性更新实例时,不必从DB重新加载实例。