默認情況下,當您創建一個域類時,它將自動爲所有域類(表)添加「id」和「version」列。如果我想添加一個專欄,例如「isChecked」,並且這應該被自動添加到所有的域類(即表格),類似「ID」和「版本」列的添加方式。我怎樣才能做到這一點,如果我不想爲特定的領域類「檢查」,我也應該能夠做到這一點。Grails - 向所有域對象添加自定義字段(列) - 自動
我該如何在Grail 1.3.7中做到這一點?
謝謝。 Jay Chandran
編輯:我可以得到更多的輸入嗎?建議的答案無效!
默認情況下,當您創建一個域類時,它將自動爲所有域類(表)添加「id」和「version」列。如果我想添加一個專欄,例如「isChecked」,並且這應該被自動添加到所有的域類(即表格),類似「ID」和「版本」列的添加方式。我怎樣才能做到這一點,如果我不想爲特定的領域類「檢查」,我也應該能夠做到這一點。Grails - 向所有域對象添加自定義字段(列) - 自動
我該如何在Grail 1.3.7中做到這一點?
謝謝。 Jay Chandran
編輯:我可以得到更多的輸入嗎?建議的答案無效!
您可以使用Groovy爲這類事物提供的元編程魔術,但是,我可能只是走更典型的路線並使用繼承。創建一個包含isChecked(以及其他任何你需要的)的父域,讓你的域需要它們擴展這個類。
我會建議創建一個修改(添加屬性)您的域文物的插件。你可以閱讀更多關於plugins and artifacts。然後,您可以輕鬆地添加一個靜態屬性(例如靜態nochecked = true),以過濾掉您不希望添加新屬性的域工件,只要您認爲合適。
您可以使用元編程來做到這一點。添加屬性的代碼應該在插件的doWithDynamicMethods
關閉中或從Bootstrap.groovy
中運行。如果使用插件的方式,這樣的事情應該工作:
def doWithDynamicMethods = {ctx ->
application.domainClasses
.findAll {it.simpleName.startsWith('S')}.metaClass.each {domainMetaClass ->
Integer fooVal = 0
domainMetaClass.getFoo = {-> fooVal}
domainMetaClass.setFoo = {Integer newFooVal -> fooVal = newFooVal}
}
}
上面的代碼應該在Integer foo
屬性添加到每個領域類的名稱以「S」開頭。我沒有測試過這個代碼,所以它可能不起作用。要看到,你可以更有信心的例子:
doWithDynamicMethods
關閉雖然這不會被Hibernate看到,所以它不能用於持久化。 –
我可以得到更多的投入?建議的答案無效! –