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说:
事务不能携带对业务对象的直接对象引用(指针)。这已被称为洗礼问题,因为它是一个常见的初学者陷阱。直接对象引用不起作用,因为一旦事务被序列化到日志然后反序列化以执行,它的对象引用不再引用预期的对象 - 他们可能首先引用的任何对象都将被序列化复制过程!因此,事务必须为它想要引用的任何对象携带某种字符串或数字标识符,并且它必须在执行时查找对象。
我认为通过克隆传入的对象,我将解决“直接对象指针”问题,但我仍然不知道这是否是个好主意......