В моем приложении мои сущности все связаны с одним объектом. Я хотел бы иметь возможность вытаскивать объект, вносить какие-либо изменения в объект (включая его дочерние элементы), а затем сохранять этот объект и каскадировать изменения, но мой базовый тест не работает.GWT RequestFactory - Сохранение изменений в дочерних объектах
Это мой основной объект, который я потянув один экземпляр и изменения:
@Entity
@Component
public class Submission extends EntityAbstract implements IsSerializable
{
...
/** List of statements in this submission. */
@OneToMany(cascade=CascadeType.ALL, mappedBy="parentSubmission")
@NotNull
@Valid
private List<Statement> statements = new LinkedList<Statement>();
...
В Statement
и Submission
классы оба содержат локализованное имя. Это мой тестовый сценарий, когда я тяну Statement
сущность я хочу, и попытаться сделать изменения:
...
// Custom request context method for Submission:
InstanceRequest< SubmissionProxy, SubmissionProxy > persist();
...
RequestFactory.getTest().get(1L).with(Submission.PropertiesALL).fire(new Receiver<SubmissionProxy>()
{
@Override
public void onSuccess(final SubmissionProxy immutableResponse)
{
final Test context = RequestFactory.getTest();
final SubmissionProxy submission = context.edit(immutableResponse);
System.out.println("received: " + submission.getLocalizedName() + ", " + submission.getStatements().get(0).getLocalizedName());
// Make some modifications:
submission.setLocalizedName("submission-" + ((char)(Random.nextInt(26) + 'A')));
submission.getStatements().get(0).setLocalizedName("statementzzz");
System.out.println("persisting: " + submission.getLocalizedName() + ", " + submission.getStatements().get(0).getLocalizedName());
context.persist().using(submission).with(Submission.PropertiesALL).fire(new Receiver<SubmissionProxy>()
{
@Override
public void onSuccess(final SubmissionProxy immutableSubmission)
{
System.out.println("success: " + submission.getLocalizedName() + ", " + immutableSubmission.getStatements().get(0).getLocalizedName());
}
});
}
});
Результаты моих испытаний показывают:
received: submissionzzz, statement-name // Called before making modifications [client]
persisting: submission-E, statementzzz // Called before persisting changes [client]
server: submission-E, statement-name // Called before persisting changes [server]
success: submission-E, statement-name // Called after persisting changes [client]
поэтому изменения к первичной сущности, Submission
, сохраняются и правильно сериализуются на сервере. Но изменения дочерних свойств, Statement
, не сериализуются на сервере, поэтому настойчивость неверна!
EDIT:
Я до сих пор не в состоянии решить эту проблему, так что я создал проблему с GWT: https://code.google.com/p/google-web-toolkit/issues/detail?id=8368&q=requestfactory&colspec=ID%20Type%20Status%20Owner%20Milestone%20Summary%20Stars. Сообщение содержит информацию о сериализованных/десериализованных объектах и включает фактическую полезную нагрузку, отправляемую/получаемую фабричным экземпляром запроса.
Похоже, что полезная нагрузка и сериализация правильны прямо перед тем, как она покидает клиентскую сторону, и как только она будет получена на стороне сервера, данные дочернего элемента отсутствуют.
Я просмотрел статью, и я следую рекомендациям, указанным о получении лица, редактирования, применения изменений, и сохраняющиеся , Я не вижу в этой статье какой-либо конкретной информации о взаимоотношениях между родителями и дочерними элементами или графике объектов фабрики запросов. Однако я ценю усилия. –
В конце статьи есть раздел, ** VI) Более сложные ловушки **, посмотрите там ... –
Я должен был прочитать этот раздел ранее, но это не решило проблему. Я попытался вызвать setChild в родительском объекте с обновленным дочерним объектом и редактировать дочерний объект отдельно, но не повезло. –