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

}

Prevayler wiki说:

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

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

4

2 回答 2

1

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

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

于 2010-05-06T10:45:12.087 回答
0

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

直接对象引用不起作用,因为一旦事务被序列化到日志然后反序列化以执行,它的对象引用不再引用预期的对象 - 他们可能首先引用的任何对象都将被序列化复制过程

在 CreateMyObject 中保留 MyObject 的唯一标识符。不是参考。克隆在这里无关紧要。

于 2010-04-13T20:10:01.670 回答