Prevayler發行版中包含的演示顯示如何將一對字符串(或類似的東西)傳入命令構造函數中以創建或更新對象。問題是我有一個名爲MyObject的對象,它有很多字段。如果我必須手動將它們全部傳遞給CreateMyObject命令,那將是一件痛苦的事情。在Prevayler命令中使用複雜對象
所以我想到的另一種方法是將我的業務對象本身傳遞到命令中,但掛在它的克隆上(記住我不能直接在命令中存儲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 {
...
}
}
交易不能進行直接對象引用(指針)到業務對象。這已被稱爲洗禮問題,因爲這是一個常見的初學者陷阱。直接對象引用不起作用,因爲一旦事務已經序列化到日誌中,然後反序列化以執行,它的對象引用就不再引用預期的對象 - 它們可能首先引用的任何對象都將被序列化處理!因此,事務必須爲它想要引用的任何對象攜帶某種字符串或數字標識符,並且它在執行時必須查找對象。
我想通過克隆傳入的對象,我會圍繞「直接對象指針」的問題會得到,但我仍然不知道這是否是一個好主意......