我想知道在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框架仅允许您更新所需的内容。因此,您不必担心要使用哪种模式。
问候,
我试图更新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会话中存在对象时,此方法才有效。如果我以后使用该对象,则当我需要该对象进入会话时,将引发