2

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は次のように述べています。

トランザクションは、ビジネスオブジェクトへの直接のオブジェクト参照(ポインター)を運ぶことはできません。これは一般的な初心者の落とし穴であるため、バプテスマの問題として知られるようになりました。トランザクションがジャーナルにシリアル化されてから実行のために逆シリアル化されると、そのオブジェクト参照は目的のオブジェクトを参照しなくなるため、直接オブジェクト参照は機能しません---最初に参照した可能性のあるオブジェクトはシリアル化によってコピーされます処理する!したがって、トランザクションは、参照するオブジェクトに対して何らかの文字列または数値の識別子を保持する必要があり、実行時にオブジェクトを検索する必要があります。

渡されたオブジェクトのクローンを作成することで、「直接オブジェクトポインタ」の問題を回避できると思いますが、これが良いアイデアかどうかはまだわかりません...

4

2 に答える 2

1

元のオブジェクトに他のオブジェクトへの参照がないことを確認しない限り、クローンはバプテスマの問題を解決するのに役立ちません。しかし、それはあなたが説明したものとは異なる問題です。

それほど多くのcreateCommandを記述したくない場合は、名前と値のペアのディクショナリと作成するクラスへのキーを渡します。

于 2010-05-06T10:45:12.087 に答える
0

私はPrevaylerを使用したことがなく、あなたの問題を理解しているかどうかはわかりませんが、あなたは自分自身に答えを与えたと思います。

トランザクションがジャーナルにシリアル化されてから実行のために逆シリアル化されると、そのオブジェクト参照は目的のオブジェクトを参照しなくなるため、直接オブジェクト参照は機能しません---最初に参照した可能性のあるオブジェクトはシリアル化によってコピーされます処理する

CreateMyObjectで、MyObjectの一意の識別子を保持します。参照ではありません。ここでは、クローン作成とは何の関係もありません。

于 2010-04-13T20:10:01.670 に答える