Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails 数据从数据库中消失?_Grails - Fatal编程技术网

Grails 数据从数据库中消失?

Grails 数据从数据库中消失?,grails,Grails,我正在运行一个grails应用程序,收到了我可能遇到过的最奇怪的错误。模型中的一个“字段”得到的数据无缘无故地消失了 我的项目中有两个模型或一个域类,设置如下: class Insertion { String title Date insertDate static hasMany = Dataholder static constraints = { title(unique: true) } } class Dataholder { String pr

我正在运行一个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 = {
    }
}
我做了一些验证并将数据应用到每个数据持有者,然后如果一切顺利,
if(!errors)
我将插入添加到每个对象。完成后,我保存每个对象,将数据保存到数据库中。你可能认为这里出了问题,但等着瞧,你会大吃一惊的

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

results.each {
                it.somedatalist.each { it2 ->
                    if(!weekdays.contains(it2))
                        weekdays.add(it2)
                }
            }
使用数据列表中的所有唯一项填充数组。然后将其打印到视图中,瞧:

现在,我们只需等待用户确认视图中的所有数据,当他或她单击确认按钮时,插入标题将与post to函数一起发送,该函数将检索数据,
somedatalist
为空

这是检索数据的功能:

    def result = Insertion.findByTitle(insertionTitle)

    def results = Dataholder.findAllByInsertions(result)
当在
结果之后放置断点时
我可以确定每个
数据持有者
都包含正确的数据,除了
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,我使用的是Grails2.1

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


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

我刚刚想到了这一点。将对象集合持久化为单列会破坏第一种正常形式,因此这不是正确的方法。我立即在谷歌上搜索了一个关于吉拉的问题:


正确的方法是使用单个字符串attibute创建一个新的域类,并使用标准的一对多关系。

我刚刚想到了这一点。将对象集合持久化为单列会破坏第一种正常形式,因此这不是正确的方法。我立即在谷歌上搜索了一个关于吉拉的问题:


正确的方法是使用单个字符串attibute创建一个新的域类,并使用标准的一对多关系。

自从Grails 2.0以来,您可以使用“dbconsole”查看数据库,也可以查看内存中的:好的,谢谢您的建议。我不知道,因为我对Grails很陌生。当我检查后,将返回答案。由于Grails2.0,您可以使用“dbconsole”查看数据库,也可以查看内存中的:好的,谢谢您的建议。我不知道,因为我对Grails很陌生。我检查完后会带着答案回来。该死,我真的很害怕我会那么容易(你会很快进入它的!祝你好运:-)我想知道,我怎么能首先保存它,为什么我的测试没有失败?你真的看到数据库中的数据了吗?难道它不只是内存中的域实例吗?该死,我真的很害怕我会那么容易(你会很快进入它的!祝你好运:-)我想知道,我怎么能首先保存它,为什么我的测试没有失败?你真的看到数据库中的数据了吗?它不是内存中唯一的域实例吗?
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
    }