1

我需要一个包含Strings. 众所周知,GORM 无法处理这个问题,所以我已经解决了这个问题。起初我尝试在域类中使用 getter 和 setter,但这会导致问题。然后我在 Stack Overflow 上找到了一种使用afterLoad()beforeValidate()重写属性的方法,如下所示。这很有效,让我可以将其List变成String持久性并返回到List应用程序中使用。

    class Entries {
        // persisted to database
        String _entry

        // exposed to app
        List entry

        static transients = ['entry']   //don't try to persist the List

        def afterLoad() {
                            // split the String from the database into a List
            entry = _entry?.split('\\|')
        }

        def beforeValidate() {
                            // join the List into a String for persisting
            _entry = entry.join('|')
        }

        static constraints = {
            _entry maxSize:4000
        }
    }

这以编程方式工作正常。唯一的问题是 Grails 脚手架无法处理这个问题,即使我尝试输入管道分隔的字符串。我理解脚手架创建表单字段的原因_entry,因此entry在尝试保存对象时为 null。并beforeValidate()依赖于一个字符串列表来工作。

我试图在控制器中解决这个问题,params.entry = params._entry方法是在调用new Entries(params). [我认识到这不是一个完美的解决方案,但这是我第一次让表单工作。] 然后我添加了一个测试beforeValidate()来设置entry = _entryif entryis null。基本上:

条目控制器.groovy:

params.entry = params._entry    // I added this line
def entriesInstance = new Entries(params)

条目.groovy:

    def beforeValidate() {
        if( entry == null ) entry = _entry    // I added this line
        _entry = entry.join('|')
    }

我认为这将允许我将管道分隔的字符串输入到脚手架的 Create Entries 表单中,并将某些内容输入数据库。

然而,令我惊讶的是,我发现两者entry_entrynull在 中beforeValidate(),即使我打印并验证params了控制器中包含两个键。我不明白为什么会这样。我是如何添加新密钥以params导致空值到达域类的?

接下来的问题当然是,让脚手架的 Create Entries 表单接受一个管道分隔的 String 并将其放入数据库的正确方法是什么?

4

1 回答 1

2

我需要一个包含字符串列表的域类。众所周知,GORM 无法处理这个问题,所以我已经解决了这个问题。

我不同意你的看法

class Xyz {

static hasMany = [entries: String]

}

应该创建一个单独的表来保存您的字符串列表(它实际上是一个集合)。这是文档

于 2013-01-10T04:43:13.583 回答