我想知道在Java上使用HB更新分离对象的某些字段的最佳方法是什么。特别是当对象具有子对象属性时。例如(删除注释并减少字段数以减少噪声):
public class Parent { int id; String field2; ... Child child; } public class Child { int id; String field3; }
在MVC Web 应用程序中更新父级时,我可以使用 Session.get(Parent.class,123) 调用父级实例,使用它来填充表单并显示它。没有DTO,只有分离的父级传递到视图并绑定到表单。现在,我只想允许用户更新父级的 field2 属性。因此,当用户发布表单时,我得到一个填充了id和field2的Parent实例(我认为mvc框架在这里无关紧要,绑定时它们的行为基本相同)。 现在,哪种策略最适合执行实体更新?我可以考虑几种选择,但我想听听专家的意见:)(请记住,我不想失去父实例与子实例之间的关系)
A) 从会话中再次获取父实例,并手动替换更新的字段
Parent pojoParent; //binded with the data of the Form. Parent entity = Session.get(Parent.class,pojoParent.getId()); entity.setField2(pojoParent.getField2()).
我经常使用这个。但是pojoParent似乎被用作卧底DTO。如果要更新的字段数量变多,它也会变得很糟糕。
B) 将子项存储在某个地方(httpSession?),然后将其关联。
Parent parent = Session.get(Parent.class,123); //bind the retrieved parent to the form // store the Child from parent.getChild() on the httpSession ... //when the users submits the form... pojoParent.setChild(someHttpSessionContext.getAttribute('Child')) Session.save(pojoParent);
我认为这很糟糕,但我在某些项目中看到了…
C) 将父子关系设置为不可变。在关系上使用 updatable = false ,我可以更新任何父字段,而不必担心失去孩子。无论如何,这是非常严格的,并且这种关系永远不会更新。
那么,您认为解决这种情况的最佳方法是什么?
先感谢您!
加载父对象后,您说
现在,我只想允许用户更新父项的field2属性
根据用例,您可以使用UpdateableParent对象
public class UpdateableParent { private String field2; // getter's and setter's }
现在我们的父仓库
@Repository public class ParentRepositoryImpl implements ParentRepository { @Autowired private SessionFactory sessionFactory; public void updateSpecificUseCase(UpdateableParent updateableParentObject) { Parent parent = sessionFactory.getCurrentSession().load(Parent.class, updateableParentObject.getId()); try { // jakarta commons takes care of copying Updateable Parent object to Parent object BeanUtils.copyProperties(parent, updateableParentObject); } catch (Exception e) { throw new IllegalStateException("Error occured when updating a Parent object", e); } } }
优点
尽管这不是与技术相关的问题,但是Seam框架仅允许您更新所需的内容。因此,您不必担心要使用哪种模式。
问候,