我有一个基于Hibernate的模型对象,例如十个字段。我需要将其中六个传递给一个Spring表单并将它们取回,但其他四个不需要进行往返表单。但是,当Hibernate对象保存在数据库中时,他们需要坚持更新/创建。如果我不需要,我宁愿不将它们作为隐藏字段放在表单上,其中一些可能具有敏感数据。
最好的方法是什么?我在网上寻找解决方案,但信息/示例相当稀疏。
我一直在玩Hibernate POJO的实例作为请求范围的Spring bean,但我似乎无法使语法正确。
答案 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重新加载实例。