spring hibernate合并示例

时间:2016-03-14 02:22:06

标签: spring hibernate spring-mvc smartgwt

我有一个Spring 4和Hibernate 5后端RESTful Web服务。这很好用,所有单元测试。前端是一个SmartGWT 5.0p应用程序,它使用DataSources而不是RestDataSources与后端进行通信。

前端SmartGWT 5.0p使用listgrid编辑数据,然后将ListGrid附加到数据源。仅发送ListGrid中的已编辑数据,而不是整行。如果可以的话,我希望能够使用已编辑的数据和未编辑的数据发回整个listgrid行。如果我能得到答案,那就太好了。

或者,替代方案是我们让SmartGWT只发回部分编辑过的数据。它以JSON的形式出现在后端,并更改为Object / Entity。控制器/端点尚未在会话中,但我们在服务层中调用了一个事务性的方法。

那么,问题就变成了我们在服务层的方法中的会话中有一个分离的对象。我们有一个带有数据库主键的分离对象......但它也有1或2个更新数据字段,现在我们想将这些数据合并回数据库。我们无法使用此实体调用更新,因为对于部分数据,某些字段被设置为null。实际上,我们希望从数据库中撤回项目,更新已编辑的字段,然后将数据写回数据库。

我可以手动完成所有操作......但我必须这样做吗?我希望有一种更优雅的方式来处理这个问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

这只是部分答案:
我可以让SmartGWT将旧值和新值与我在此处找到的链接结合起来:

SMARTGWT DataSource (GWT-RPC-DATASource) LISTGRID

代码如下:

private ListGridRecord getEditedRecord(DSRequest request)
{
    // Retrieving values before edit
    JavaScriptObject oldValues = request
            .getAttributeAsJavaScriptObject("oldValues");

    // Creating new record for combining old values with changes
    ListGridRecord newRecord = new ListGridRecord();

    // Copying properties from old record
    JSOHelper.apply(oldValues, newRecord.getJsObj());

    // Retrieving changed values
    JavaScriptObject data = request.getData();

    // Apply changes
    JSOHelper.apply(data, newRecord.getJsObj());

    return newRecord;
}

此JSON字符串包含更新的新字段和旧字段。当这个json字符串被发送回RESTful后端时,Jackson Mapper会创建一个实体并将所有字段放入,这实际上是一个分离的实体。它是会话之外的对象,但id驻留在数据库中。

因为我有一个完整的实体,所以我可以进行更新,这是有效的。 问题解决了。

但是,我仍然希望找到一个优雅的解决方案来获取一个分离的实体,从数据库中获取原始记录,然后合并这两个对象,最后更新记录。

在Spring的Service层中有一个事务,并创建会话, 手动过程,我不想做的事情可能是这样的:

1) get the id from the updatedEntity
2) get that attachedEntity from the database using that id
3) compare the fields
   if( updatedEntity.updateField1 != null ) 
   {   attachedEntity.setField1(updatedEntity.updateField1)   }
   If I had to do step 3 for multiple fields,  
   that's not very elegant.
4) Update attachedEntity to the database, because it now has updated fields.

因此,再一次,一个优雅的解决方案可能会有所帮助。谢谢!