当前位置: 首页 > 面试题库 >

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

朱阳曜
2023-03-14
问题内容

我想知道在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);
        }

    }

}

优点

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

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

问候,



 类似资料:
  • 我试图更新mongodb集合的某个值,但没有成功,它只更新一个字段,而不更新另一个字段,下面是我的代码, 模式: 下面是控制台结果,其中包含mongoose调试 猫鼬:clients.findone({_id:ObjectId(“57AA0403B8F3786D09D8C626”)}){fields:未定义} 之前的数据:{datePayment:2016-08-09T18:03:07.501z,

  • 问题内容: 假设我们有一个对象类型,从而产生。 现在,我们要创建一个新的对象,这只是(即场和来自被修剪)。所以我们定义一个类如下: 然后我们初始化如下: 。 不幸的是,执行此操作时出现运行时错误。 问题: 我们如何如上所述定义? 问题答案: 假设你有三个字段中 创建一个新的字段 声明一个方法是这样 从A设置B的必填字段。 例如 设置f1并返回B对象 .B将成为一个成员,你可以简单地从A取得乙。 f

  • 问题内容: 如果您将数组作为状态的一部分,并且该数组包含对象,那么通过更改其中一个对象来更新状态的简便方法是什么? 示例,从关于react的教程中修改而来: 问题答案: 在更新状态时,关键部分是将其视为不变。如果可以保证,任何解决方案都可以。 这是我使用immutability-helper的解决方案: jsFiddle:

  • 我已经搜索和尝试了许多答案,但我似乎无法让这个工作。我在MongoDB中有一个用户(db.users...)我试图在一个特定的文档中更新一个名为“角色”的字段。如果我执行: assert失败:需要对象错误:在printStackTrace(src/mongo/shell/utils.js:37:15)在doassert(src/mongo/shell/assert.js:6:5)在assert(s

  • 我正在使用Android MVVM架构和LiveData。我有一个这样的物体 我的视图模型是这样的 如何确保用户对象中的某个字段发生更改时,观察员收到通知?顺便说一句,重要的是要将这些数据保存在单独的对象中,而不是在ViewModel中使用字符串等主要值。

  • 问题内容: 我遇到一种情况,我需要将分离的对象重新附加到hibernate会话,尽管会话中可能已经存在相同标识的对象,这将导致错误。 现在,我可以做两件事之一。 当且仅当hibernate会话中不存在对象时,此方法才有效。当以后需要时,将引发异常,指出具有给定标识符的对象已存在于会话中。 仅当hibernate会话中存在对象时,此方法才有效。如果我以后使用该对象,则当我需要该对象进入会话时,将引发