2013-09-25 20 views
1

在我的应用程序中,我的实体都来自单个实体。我希望能够拉动这个实体,对这个实体(包括它的子女)进行任何修改,然后坚持这个实体并将这些修改级联 - 但是我的基本测试失败了。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>(); 
    ... 

StatementSubmission类都包含一个本地化的名称。这是我的测试场景,我拉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未被序列化到服务器,因此持久性不正确!

编辑

我还一直没能解决的问题,所以我创建了一个问题,与GWT:https://code.google.com/p/google-web-toolkit/issues/detail?id=8368&q=requestfactory&colspec=ID%20Type%20Status%20Owner%20Milestone%20Summary%20Stars。该文章包含有关序列化/反序列化对象的信息,并包含请求工厂实例发送/接收的实际有效载荷。

它看起来好像负载和序列化在它离开客户端之前是正确的,并且一旦它在服务器端收到子数据丢失。

回答

1

我猜你像在我经历的文章看的this article

+0

年底提出的一个情况跑去,我按照有关接收实体,编辑,应用的变化,并持续指定的指导方针。在这篇文章中,我没有看到有关父/子关系或请求工厂对象图的任何特定信息。不过,我很欣赏这种努力。 –

+0

在文章的最后,有一个部分,** VI)更复杂的陷阱**,看看那里... –

+0

我必须早先阅读过该部分,但它没有解决问题。我已经尝试使用更新后的子对象调用“setChild”,并单独编辑子对象,但没有运气。 –