2010-01-18 37 views
11

我想知道在Java上使用HB来更新某个独立对象的某些字段的最佳方法是什么。特别是当对象具有子对象属性时。对于实施例(注释除去和字段数目减少,以降低噪声):在Hibernate上更新分离对象的某些字段的最佳方法?

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为id和field2的Parent实例(我认为mvc框架在这里不重要,所有的行为在绑定时都大致相同)。
现在,哪种策略最适合执行实体更新?我能想到的几个选择,但我想听听专家:)(记住,我不想失去父母和孩子实例之间的关系)

A)再次Retrive从会议父实例和用手取代更新的字段

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)设置父母与子女作为inmutable之间的关系。在关系上使用updatable = false我可以更新任何父字段而不用担心丢失孩子。无论如何,这是相当严格的,并且这种关系永远不会被更新。

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

预先感谢您!

回答

10

加载父对象后,你说

现在,我只希望允许用户更新父的场2属性

根据使用情况,您可以使用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框架允许您只更新你想要的。所以你不必担心使用什么样的模式。

问候,

0

您可以直接修改分离的对象,然后使用会话上的merge方法将对象重新挂接到会话。

3

A)从 再次Retrive父实例的会话,并用手 更换更新的字段

这似乎是我使用过的功能最全的版本过去几年。

B)存放儿童某处 (HttpSession的?)和准它 后者。

我会建议不要这样做,特别是如果你想遵循REST范例,它使服务器端状态成为一个完整的禁止否定。你会最终使用的堆空间对脱管对象,但谁发起会话的用户离开咖啡:)

C)设置家长和儿童 作为永恒不变的关系。

恕我直言,这也不是一个好方法,虽然它可以适用于小型持久模型的项目。但即使在一个小应用程序中,当尝试修改代码时也可能导致头痛。

相关问题