【发布时间】:2014-04-13 17:00:25
【问题描述】:
我正在开发一个 Grails 2.3.7 应用程序,但在使用选择框更改域属性时遇到问题。每次我尝试更改属性并保存时,我都会得到一个HibernateException: identifier of an instance of Ethnicity was altered from X to Y。我不想更改种族的ID,我只是想将ApplicationPersons 的种族从一个更改为另一个。
需要注意的几点:
- 我正在使用相同的控制器操作来创建和更新人员。
- 在
personInstance.properties = params之前将personInstance.ethnicity设置为null将使保存工作,但我 不知道为什么,我不想为每个协会都这样做 我想改变。 - 我意识到域模型似乎很奇怪。这是一个我无法更改的遗留数据库。
这是我的域类:
class ApplicationPerson implements Serializable {
Integer appId
Integer applicationSequenceNumber
String firstName
String lastName
Ethnicity ethnicity
static mapping = {
id composite: ['appId', 'applicationSequenceNumber'],
generator: 'assigned'
}
}
class Ethnicity {
String code
String description
static mapping = {
id name: 'code', generator: 'assigned'
}
}
这是我的_form.gsp 来更新Ethnicity(我删除了所有其他保存得很好的属性):
<div class="fieldcontain ${hasErrors(bean: personInstance,
field: 'ethnicity', 'error')} ">
<label for="ethnicity">Ethnicity</label>
<g:select id="ethnicity"
name="ethnicity.code"
from="${Ethnicity.list()}"
optionKey="code"
value="${personInstance?.ethnicity?.code}" />
</div>
最后,表单 POST 到的我的控制器操作:
def save() {
Application app = applicationService.getCurrentApplication()
// Find/Create and save Person
ApplicationPerson personInstance = app.person
if (!personInstance) {
personInstance =
new ApplicationPerson(appId: app.id,
applicationSequenceNumber: app.sequenceNumber)
}
personInstance.properties = params
if (!personInstance.validate()) {
respond personInstance.errors, view:'edit'
return
}
personInstance.save flush:true
redirect action: 'list'
}
【问题讨论】:
-
复合键中的
aidm是什么? -
一个错字。感谢您指出这一点。
-
您使用迁移脚本吗?备份后自动创建数据库怎么样...?
-
不幸的是,事情没那么简单。这是一所大学的遗留数据库。我不能真正改变任何东西,只需要在它之上创建一个应用程序。
标签: grails grails-orm grails-2.0 grails-domain-class