Prevaylerディストリビューションに含まれているデモは、オブジェクトを作成または更新するために、いくつかの文字列(またはそのような単純なもの)をコマンドコンストラクターに渡す方法を示しています。問題は、多くのフィールドを持つMyObjectというオブジェクトがあることです。それらすべてを手動でCreateMyObjectコマンドに渡さなければならない場合、それは苦痛になります。
したがって、私が考えた別の方法は、ビジネスオブジェクト自体をコマンドに渡すことですが、そのクローンにぶら下がることです(BOをコマンドに直接格納できないことに注意してください)。もちろん、このコマンドを実行した後は、渡した元のコピーを必ず破棄する必要があります。
public class CreateMyObject implements TransactionWithQuery {
private MyObject object;
public CreateMyObject(MyObject business_obj) {
this.object = (MyObject) business_obj.clone();
}
public Object executeAndQuery(...) throws Exception {
...
}
}
Prevaylerwikiは次のように述べています。
トランザクションは、ビジネスオブジェクトへの直接のオブジェクト参照(ポインター)を運ぶことはできません。これは一般的な初心者の落とし穴であるため、バプテスマの問題として知られるようになりました。トランザクションがジャーナルにシリアル化されてから実行のために逆シリアル化されると、そのオブジェクト参照は目的のオブジェクトを参照しなくなるため、直接オブジェクト参照は機能しません---最初に参照した可能性のあるオブジェクトはシリアル化によってコピーされます処理する!したがって、トランザクションは、参照するオブジェクトに対して何らかの文字列または数値の識別子を保持する必要があり、実行時にオブジェクトを検索する必要があります。
渡されたオブジェクトのクローンを作成することで、「直接オブジェクトポインタ」の問題を回避できると思いますが、これが良いアイデアかどうかはまだわかりません...