2015-05-21 34 views
1

我正在嘗試將一個域對象的屬性複製到另一個相似的域對象(基本上將退休數據從存檔集合中移動到活動狀態)。但是,當我嘗試使用手動輸入的id保存時,保存實際上不會將任何內容放入集合中。是否有可能爲grails域對象保存特定的ID?

def item = new Item(style: "631459") 
item.id = new ObjectId("537da62d770359c2fb4668e2") 
item.save(flush: true, validate: false, failOnError:true) 

failOnError不會引發異常,它看起來像保存工作正常。另外,如果我println item.save它將返回正確的ID。我錯在認爲你可以在域對象上放置一個特定的ID嗎?

回答

1

標識符id是一個有點敏感的名字使用。如果你檢查你的dbconsole,你會發現GORM爲你提供了一個,即使沒有問。當你爲自己使用這個名字時,會發生混淆。 Grails會用println的東西來尊重你,但是GORM對於id是如何被初始化和存儲的問題有了最後的理解,並且它並沒有聽你的話。

你可以像你this post看到,也許,你可以使用名稱ID自己的ID重命名爲別的東西。否則,我建議將id留給GORM,併爲您的舊密鑰設置自己的標識符。無論如何你都不會有檢索數據的問題,並且不會有性能問題。

+0

謝謝你的回答,我懷疑是這樣,但是想確保我沒有過分看起來很傻。 –

+1

不客氣。 @juandiegoh給出的答案也是正確的,但請記住兩件事:i)* new Item(id:...)*將不起作用,因此您手動將* id設置爲* item.setId(.. *)* save()*之前,和ii)現在,您的負擔是強制執行id唯一性。因此,我仍然建議您讓GORM爲您開啓id駕駛。 – mohsenmadi

+0

看起來@DavidB正在使用MongoDB進行存儲,所以id的唯一性不會成爲問題,因爲MongoDB的對象ID始終是唯一的。 –

2

您可以將ID生成器設置爲'分配',以便您可以將您想要的值與要用該值保存的值相比較。

class Item { 

... 

    static mapping = { 
     id generator:'assigned' 
    } 
} 
+0

謝謝你的回答,你提到的方式確實有效,但正如@mohsenmadi上面所說的,它增加了複雜性,以確保每個項目的獨特性。 –

相關問題