【问题标题】:GWT RequestFactory - Persist changes to children entitiesGWT RequestFactory - 保持对子实体的更改
【发布时间】:2013-09-25 18:35:29
【问题描述】:

在我的应用程序中,我的实体都源自一个实体。我希望能够拉出实体,对实体(包括其子实体)进行任何更改,然后保留该实体并将更改级联 - 但我的基本测试失败了。

这是我要提取和修改单个实例的主要实体:

@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。该帖子包含有关序列化/反序列化对象的信息,并包括请求工厂实例正在发送/接收的实际有效负载。

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

【问题讨论】:

    标签: gwt requestfactory


    【解决方案1】:

    我猜你是在this article结尾处出现的情况下运行的

    【讨论】:

    • 我浏览了这篇文章,并遵循了关于接收实体、编辑、应用更改和持久化的指导方针。我在那篇文章中没有看到有关父/子关系或请求工厂对象图的任何具体信息。不过,我感谢您的努力。
    • 文末有一节,VI)更复杂的陷阱,看看那里...
    • 我之前一定已经阅读过该部分,但它并没有解决问题。我尝试使用更新的子对象在父对象上调用“setChild”,并单独编辑子对象但没有运气。
    • 是的,也许关键是删除孩子并重新添加它,作为一种解决方法......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    相关资源
    最近更新 更多