2011-08-08 28 views
2

默認情況下,當您創建一個域類時,它將自動爲所有域類(表)添加「id」和「version」列。如果我想添加一個專欄,例如「isChecked」,並且這應該被自動添加到所有的域類(即表格),類似「ID」和「版本」列的添加方式。我怎樣才能做到這一點,如果我不想爲特定的領域類「檢查」,我也應該能夠做到這一點。Grails - 向所有域對象添加自定義字段(列) - 自動

我該如何在Grail 1.3.7中做到這一點?

謝謝。 Jay Chandran

編輯:我可以得到更多的輸入嗎?建議的答案無效!

+0

我可以得到更多的投入?建議的答案無效! –

回答

3

您可以使用Groovy爲這類事物提供的元編程魔術,但是,我可能只是走更典型的路線並使用繼承。創建一個包含isChecked(以及其他任何你需要的)的父域,讓你的域需要它們擴展這個類。

+0

而且你很可能想要在父類的映射關閉中禁用每個層次表的方式,以支持table-per-subclass方案。 – codelark

+0

@codelark你能用一個例子來詳細說明嗎? –

+0

@Jay Chandran [GORM docs]中有一個例子(http://grails.org/doc/latest/guide/single.html#5.5.2%20Custom%20ORM%20Mapping)。第5.5.2.3節。 – codelark

0

我會建議創建一個修改(添加屬性)您的域文物的插件。你可以閱讀更多關於plugins and artifacts。然後,您可以輕鬆地添加一個靜態屬性(例如靜態nochecked = true),以過濾掉您不希望添加新屬性的域工件,只要您認爲合適。

-1

您可以使用元編程來做到這一點。添加屬性的代碼應該在插件的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」開頭。我沒有測試過這個代碼,所以它可能不起作用。要看到,你可以更有信心的例子:

  1. 查找插件補充說,修改域類(如增加一個字段或方法)
  2. 下載它
  3. 看代碼的插件描述的doWithDynamicMethods關閉
  4. 複製,粘貼和適應您的需求
+0

雖然這不會被Hibernate看到,所以它不能用於持久化。 –