Working with complex objects in Prevayler commands

Posted by alexantd on Stack Overflow See other posts from Stack Overflow or by alexantd
Published on 2010-03-18T17:16:31Z Indexed on 2010/03/18 17:21 UTC
Read the original article Hit count: 272

Filed under:

The demos included in the Prevayler distribution show how to pass in a couple strings (or something simple like that) into a command constructor in order to create or update an object. The problem is that I have an object called MyObject that has a lot of fields. If I had to pass all of them into the CreateMyObject command manually, it would be a pain.

So an alternative I thought of is to pass my business object itself into the command, but to hang onto a clone of it (keeping in mind that I can't store the BO directly in the command). Of course after executing this command, I would need to make sure to dispose of the original copy that I passed in.

public class CreateMyObject implements TransactionWithQuery {

    private MyObject object;

    public CreateMyObject(MyObject business_obj) {
        this.object = (MyObject) business_obj.clone();
    }

    public Object executeAndQuery(...) throws Exception {
        ...
    }

}

The Prevayler wiki says:

Transactions can't carry direct object references (pointers) to business objects. This has become known as the baptism problem because it's a common beginner pitfall. Direct object references don't work because once a transaction has been serialized to the journal and then deserialized for execution its object references no longer refer to the intended objects - - any objects they may have referred to at first will have been copied by the serialization process! Therefore, a transaction must carry some kind of string or numeric identifiers for any objects it wants to refer to, and it must look up the objects when it is executed.

I think by cloning the passed-in object I will be getting around the "direct object pointer" problem, but I still don't know whether or not this is a good idea...

© Stack Overflow or respective owner

Related posts about prevayler