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 {
...
}
}
事务不能携带对业务对象的直接对象引用(指针)。这被称为洗礼问题,因为这是一个常见的初学者陷阱。直接对象引用不起作用,因为一旦事务被序列化到日志然后反序列化以便执行,其对象引用就不再引用预期的对象 - - 它们最初可能引用的任何对象都将被序列化复制处理!因此,事务必须为它想要引用的任何对象携带某种字符串或数字标识符,并且它必须在执行时查找对象。
我认为通过克隆传入的对象,我将绕过“直接对象指针”问题,但我仍然不知道这是否是一个好主意......
答案 0 :(得分:1)
克隆不会帮助你解决洗礼问题,除非你确保原始对象没有引用其他对象。但这与你描述的问题不同。
如果您不想编写这么多createCommands,请传入名称 - 值对的字典和要创建的类的键。
答案 1 :(得分:0)
我从未使用过Prevayler而且我不确定我是否理解你的问题,但我认为你给了自己一个答案:
直接对象引用不起作用 因为一旦交易一直存在 序列化到期刊然后 反序列化以执行其对象 引用不再引用 预期的对象 - - 他们的任何对象 可能首先会提到 已被序列化复制 过程
在CreateMyObject中保留MyObject的uniqe标识符。不是参考。克隆与此无关。