2010-03-18 40 views
2

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

} 

Prevayler wiki說:

交易不能進行直接對象引用(指針)到業務對象。這已被稱爲洗禮問題,因爲這是一個常見的初學者陷阱。直接對象引用不起作用,因爲一旦事務已經序列化到日誌中,然後反序列化以執行,它的對象引用就不再引用預期的對象 - 它們可能首先引用的任何對象都將被序列化處理!因此,事務必須爲它想要引用的任何對象攜帶某種字符串或數字標識符,並且它在執行時必須查找對象。

我想通過克隆傳入的對象,我會圍繞「直接對象指針」的問題會得到,但我仍然不知道這是否是一個好主意......

回答

1

除非您確定原始對象沒有對其他對象的引用,否則克隆不會幫助您解決洗禮問題。但那是一個與你所描述的不同的問題。

如果您不想編寫如此多的createCommands,請將名稱 - 值對字典和關鍵字傳遞給要創建的類。

0

我有從來沒有使用過Prevayler,我不知道如果我理解你的問題,但我認爲你給自己一個答案:

直接對象引用不工作 因爲一旦交易已經 序列化到軸頸和然後 反序列化以執行其對象 引用不再引用 意圖對象 - - 它們 可以在第一意願 已經提到的任何目的通過串行化 過程

在CreateMyObject複製保持爲MyObject的的uniqe標識符。不是一個參考。克隆無關於此。