2

私のアプリケーションでは、私のエンティティはすべて単一のエンティティから派生しています。エンティティをプルし、エンティティ (その子を含む) に変更を加えてから、そのエンティティを永続化し、変更をカスケードできるようにしたいと考えていますが、基本的なテストは失敗しています。

これは、単一のインスタンスを取得して変更する主要なエンティティです。

@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はサーバーにシリアル化されないため、永続性は正しくありません!

編集

まだ問題を解決できていないので、GWT で問題を作成しました: https://code.google.com/p/google-web-toolkit/issues/detail?id=8368&q=requestfactory&colspec=ID%20Type %20Status%20Owner%20Milestone%20Summary%20Stars . この投稿には、シリアライズ/デシリアライズされたオブジェクトに関する情報が含まれており、リクエスト ファクトリ インスタンスが送受信している実際のペイロードが含まれています。

クライアント側を離れる直前にペイロードとシリアル化が正しいように見え、サーバー側で受信されるとすぐに子データが欠落しています。

4

1 に答える 1

2

この記事の最後に示したような状況に陥ったと思います

于 2013-09-26T15:56:40.073 に答える