私のアプリケーションでは、私のエンティティはすべて単一のエンティティから派生しています。エンティティをプルし、エンティティ (その子を含む) に変更を加えてから、そのエンティティを永続化し、変更をカスケードできるようにしたいと考えていますが、基本的なテストは失敗しています。
これは、単一のインスタンスを取得して変更する主要なエンティティです。
@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 . この投稿には、シリアライズ/デシリアライズされたオブジェクトに関する情報が含まれており、リクエスト ファクトリ インスタンスが送受信している実際のペイロードが含まれています。
クライアント側を離れる直前にペイロードとシリアル化が正しいように見え、サーバー側で受信されるとすぐに子データが欠落しています。