我正在运行grails应用程序,我收到了我可能遇到过的最奇怪的错误。模型中的一个“字段”获得的数据无缘无故地消失。
我的项目中有两个Model或一个Domain类,设置如下:
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模型中,消失的 ONLY 数据是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 to function,这将检索数据,令我惊讶{{ {1}}为空。
这是检索数据的功能:
somedatalist
在 def result = Insertion.findByTitle(insertionTitle)
def results = Dataholder.findAllByInsertions(result)
之后设置断点时,我可以确定每个results
包含正确的正确数据,但Dataholder
等于somedatalist
。< / p>
我尝试使用“插入标题”而不是仅使用对象来获取上述数据,并且效果很好。我无法理解为什么数据会在一秒内填充到数据库中,以及某些东西可能会消失?
测试:
null
此测试全部返回true,我使用的是Grails 2.1。
编辑:我使用内存数据库并将“更新”作为配置。所以我无法真正查看数据。但它应该在那里。
请帮助我提供你的圣人建议和更好的智慧。
答案 0 :(得分:3)
它刚出现在我的脑海里。将对象集合保持为单个列会破坏第一个正常形式,因此这不是正确的方法。我立即在JIRA中搜索了一个问题:
http://jira.grails.org/browse/GRAILS-1023
正确的方法是使用单个String属性创建一个新的域类,并使用标准的一对多关系。