2016-03-14 3 views
0

У меня есть веб-сервис RESTful Spring 4 и Hibernate 5. Это отлично работает, и все тестируются на единицу. Передним интерфейсом является приложение SmartGWT 5.0p, которое использует DataSources, а не RestDataSources для связи с внутренним концом.пример слияния весеннего спящего режима

В интерфейсе SmartGWT 5.0p используется listgrid для редактирования данных, а затем ListGrid привязан к источнику данных. Только отредактированные данные в ListGrid отправляются обратно, а не вся строка. Если бы я мог, я хотел бы иметь возможность отправить назад всю строку listgrid с отредактированными данными и неотредактированными данными. Если бы я мог ответить на это, это было бы здорово.

Или, альтернативный вариант, мы позволяем SmartGWT отправлять только часть данных, которые редактируются. Это относится к внутреннему контенту как JSON и заменяется на Object/Entity. Контроллер/конечная точка еще не находится в сеансе, но затем мы вызываем метод на сервисном уровне, который является транзакционным.

Итак, тогда вопрос будет у нас есть отдельный объект в сеансе в методе на уровне сервиса. У нас есть отдельный объект с базовым ключом базы данных ... но он также имеет 1 или 2 поля обновленных данных, и теперь мы хотим объединить эти данные с базой данных. Мы не можем вызывать обновление с этим объектом, потому что с частичными данными некоторые из полей устанавливаются в нуль. В действительности мы хотим отменить элемент из базы данных, обновить отредактированные поля и затем записать данные обратно в базу данных.

Я мог бы сделать это все вручную ... но мне нужно? Я ожидаю, что будет более грациозный способ справиться с этим.

Спасибо!

+0

Не знаете, как вы обновляете отредактированные поля, но с помощью HQL вы можете обновлять только отредактированные поля, не получая объект. Это то, что вы ищете? –

+0

Нет, не то, что я ищу. – tjholmes66

ответ

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 создает объект и помещает все поля, это, по сути, отдельный элемент. Это объект за пределами сеанса, но идентификатор находится в базе данных.

Поскольку у меня есть полная сущность, я могу все обновить, и это работает. Проблема решена.

НО, я все еще хотел бы найти элегантное решение для взятия отдельного объекта, получить исходную запись из базы данных, а затем объединить эти два объекта, а затем, наконец, обновить запись.

В слое службы в Spring, которая имеет транзакцию, и создает сеанс, ручной процесс, который я не хочу, чтобы сделать может выглядеть примерно так:

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. 

Итак, снова, элегантное решение для исправления этого может быть полезно. Благодаря!

Смежные вопросы