0

我正在运行一个 grails 应用程序,并且收到了我可能遇到过的最奇怪的错误。模型中的一个“字段”获得了无缘无故消失的数据。

我的项目中有两个模型或域类,设置如下:

class Insertion {

String title
Date insertDate

static hasMany = Dataholder

  static constraints = {
    title(unique: true)
  }
}



class Dataholder {

    String product
    int somenumber
    int somenumber2
    int somenumber3
    Date startDate
    Date endDate
    List<String> somedatalist
    Insertion insertions

    static belongsTo = Insertion

    static constraints = {
    }
}

“插入”类代表用户每次可能输入一堆数据持有者。数据持有者代表该特定产品的所有数据。重要的是要知道消失的数据包含在 Dataholder 模型中,唯一消失的数据是somedatalist.

当我插入数据并保存它时,这是完全令人困惑的魔法。一切顺利:

if (!errors) {

            dataholderValidator.each {
                it.insertion = insertion
                it.save()
            }

        def results = Dataholder.findAllByInsertion(insertion)

我做了一些验证并将数据应用到每个 Dataholder,然后如果一切顺利,if(!errors)我将插入添加到每个对象。完成后,我保存每个对象,将数据保存到数据库中。您可能认为这里出了问题,但请等待并感到惊讶。

保存后,我通过使用插入从数据库中获取所有数据持有者(因为我想确保在将数据打印给用户之前已保存数据)。这是奇怪的部分开始的地方,我得到的是正确的数据:

results.each {
                it.somedatalist.each { it2 ->
                    if(!weekdays.contains(it2))
                        weekdays.add(it2)
                }
            }

使用数据列表中的所有唯一项填充数组。然后将其打印到视图中,瞧:

具有正确数据的视图

现在,我们只需等待用户确认视图中的所有数据,当他或她单击确认按钮时,插入标题会随 post 一起发送到函数,该函数将检索数据,令我惊讶的是,somedatalist它是 null。

这是检索数据的功能:

    def result = Insertion.findByTitle(insertionTitle)

    def results = Dataholder.findAllByInsertions(result)

results当在我可以肯定地确认每个Dataholder包含正确的正确数据之后放置一个断点时,除了somedatalist等于null.

我试图通过使用插入标题而不是仅使用对象来获取上面的数据,并且效果很好。我不明白为什么数据会在一秒钟内填充到数据库中,以及某些东西怎么会消失?

测试:

void testSaveDataholder() {
        Insertions insertion = new Insertion(title: 'adadad', insertDate: new Date())
        insertion.save()
        assert Insertion.all.size() == 1
        Dataholder ed = new Dataholder(product:  'abc123', somenumber:  123, somenumber2: 13, startDate: new Date(), endDate: new Date(), somedatalist: ['TI'], insertions:  insertion)
        ed.save()
        assert Dataholder.all.size() == 1
        assert Dataholder.all.first().somedatalist.size() == 1
        assert Dataholder.all.first().insertions.title == 'adadad'
        assert Insertion.findAllByTitle('adadad').size() == 1
        assert Dataholder.findAllByInsertions(Insertion.all.first()).size() == 1
    }

这个测试全部返回 true,我使用的是 Grails 2.1。

编辑:我正在使用带有“更新”的内存数据库作为配置。所以我无法真正查看数据。但它应该在那里。

请用你的睿智建议和更好的智慧帮助我。

4

1 回答 1

3

它刚刚浮现在我的脑海。将对象集合保存到单列中会破坏第一范式,因此这不是正确的方法。我立即在 JIRA 中搜索了一个问题:

http://jira.grails.org/browse/GRAILS-1023

正确的方法是创建一个具有单个 String 属性的新域类并使用标准的一对多关系。

于 2012-09-06T08:58:02.403 回答