小编典典

在Hibernate上更新分离对象的某些字段的最佳方法?

hibernate

我想知道在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
,我可以更新任何父字段,而不必担心失去孩子。无论如何,这是非常严格的,并且这种关系永远不会更新。

那么,您认为解决这种情况的最佳方法是什么?

先感谢您!


阅读 312

收藏
2020-06-20

共1个答案

小编典典

加载父对象后,您说

现在,我只想允许用户更新父项的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);
        }

    }

}

优点

  • 这很安全:您只需更新自己真正想要的
  • 您不必担心MVC框架(某些MVC框架允许您设置allowedFields属性)。如果您忘记了一些允许的字段,会发生什么?

尽管这不是与技术相关的问题,但是Seam框架仅允许您更新所需的内容。因此,您不必担心要使用哪种模式。

问候,

2020-06-20