在Prevayler命令中使用复杂对象

时间:2010-03-18 17:16:31

标签: prevayler

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 {
        ...
    }

}

Prevayler wiki说:

事务不能携带对业务对象的直接对象引用(指针)。这被称为洗礼问题,因为这是一个常见的初学者陷阱。直接对象引用不起作用,因为一旦事务被序列化到日志然后反序列化以便执行,其对象引用就不再引用预期的对象 - - 它们最初可能引用的任何对象都将被序列化复制处理!因此,事务必须为它想要引用的任何对象携带某种字符串或数字标识符,并且它必须在执行时查找对象。

我认为通过克隆传入的对象,我将绕过“直接对象指针”问题,但我仍然不知道这是否是一个好主意......

2 个答案:

答案 0 :(得分:1)

克隆不会帮助你解决洗礼问题,除非你确保原始对象没有引用其他对象。但这与你描述的问题不同。

如果您不想编写这么多createCommands,请传入名称 - 值对的字典和要创建的类的键。

答案 1 :(得分:0)

我从未使用过Prevayler而且我不确定我是否理解你的问题,但我认为你给了自己一个答案:

  

直接对象引用不起作用   因为一旦交易一直存在   序列化到期刊然后   反序列化以执行其对象   引用不再引用   预期的对象 - - 他们的任何对象   可能首先会提到   已被序列化复制   过程

在CreateMyObject中保留MyObject的uniqe标识符。不是参考。克隆与此无关。