2012-04-25 68 views
0

在我的應用程序中,我正在更新與患者實體具有1:1關聯的對象憑證。在我的控制器中,我調用「voucherInstance.properties = params」來綁定新值。但是,當我更改憑證中的患者(尚未保存)時,然後我調用isDirty('patient'),在這種情況下IMO應該返回true,但實際上它返回false。Grails isDirty()不與協會合作

此外,getPersistentValue('patient')返回更改的值,而不是原來的值。我是否正確地使用這些方法?

感謝, Lojza

在我的控制器類:

def update() { 
    Voucher voucherInstance = voucherService.get(id) 
    voucherInstance.properties = params // patient is being sent from view by params.patient.id 
    voucherService.update(voucherInstance) 
} 

在我VoucherService類:

public Voucher update(Voucher voucher) { 
    if (voucher.isDirty('patient')) { // returns false 
     // do something 
     Patient oldPatient = voucher.getPersistentValue('patient') // returns the updated patient 
    } 
    voucher.save(flush: true) 
} 
+0

你確定你的(改變的)實例在調用'isDirty'之前沒有被保存? [getPersistentValue()](http://grails.org/doc/latest/ref/Domain%20Classes/getPersistentValue.html)應該爲您提供持久/未更改的值。如果持久化和改變的值相等,'isDirty'必須是'false'。你有一些代碼給我們嗎? – aiolos 2012-04-25 13:12:39

回答

0

我做了一些更多的谷歌搜索,發現一個解決方案,但不是一個好:http://stuff4j.blogspot.com/2011/05/i-encountered-few-times-strange.html

def update() { 
    Voucher voucherInstance = voucherService.get(id) 
    voucherInstance.patient = null 
    voucherInstance.properties = params // patient is being sent from view by params.patient.id 
    voucherService.update(voucherInstance) 
} 

這似乎是工作。但我必須明確地將所有關聯設置爲null,然後才能更新它們。

2

這裏正確的使用應該是voucherInstance.patient.isDirtyisDirty的參數化版本適用於豆田iirc。

+0

這將返回與方法相同的結果。 – 2012-04-25 14:11:59

+0

你正在改變病人還是在做一個新的?如果它是新的,它不會變髒,因爲它還沒有在數據庫中。 如果這是你正在更新的一個,那麼我實際上並不確定。 – 2012-04-27 22:47:10

+0

不,我正在更新它。你可以在我的第一篇文章中看到我添加了一些代碼。 – 2012-04-28 09:15:51