對於我目前正在研究的項目,我需要動態地將屬性添加到域類中,並稍後將其保留在數據庫中。一般來說,我需要一個連接到「普通」域類的鍵/值存儲。可悲的是我不能使用NoSQL數據庫(例如Redis)。如何在Grails中動態添加屬性/域到域類?
我的方法是通過確定它們中afterInsert
或afterUpdate
,並將它們寫入到另一個表來處理一個save()
的附加屬性 - 我寧願不要到域類,但一個額外的「現場」表中使用的地圖屬性(以更好地支持搜索)。
我嘗試添加使用的metaClass方法性質:
person.metaClass.middlename = "Biterius"
assert person.middlename == "Biterius" // OK
這工作,我可以在afterInsert /更新後的方法識別附加屬性,但似乎我不能改變的值之後 - 即,下面不工作:
person.middlename = "Tiberius"
assert person.middlename == "Tiberius" // FAIL
然後我嘗試過的Expando的方法由Expando的CL擴展Person類(直接(「Person extends Expando」)和一個抽象中間類(「Person extends AbstractPerson」和「AbstractPerson extends Expando」))。
def person = new Person()
assert person in Person // OK
assert person in AbstractPerson // OK
assert person in Expando // OK
這兩種變體都不起作用 - 我可以將值賦給任意的「屬性」,但值不會被存儲!
person.mynewproperty = "Tiberius" // no MissingPropertyException is thrown
println person.mynewproperty // returns null
所以,我怎麼能在運行時編程方式將屬性添加到域類,改變它們,並在「字段」表afterInsert或更新後期間檢索它們以「手動」存儲它們?
還是我在做一些完全錯誤的事情?有其他/更簡單的方法來做到這一點?
您是試圖保存元數據還是實際嘗試將列添加到表中動態?有點困惑 – chrislovecnm
所以字段表會爲每個新屬性生成一張表?那是你在找什麼? –
@chrislovecnm我想動態地添加一列到表。例如,將一個「中間名」添加到Person表中。 –