我正在使用 Grails 2 在带有自定义 id 字段的旧数据库上提供接口。
我有一个域类,如下所示:
class StorageFile {
static mapping = {
table 'storage_file'
// version is set to false, because this column isn't normally present in legacy databases
version false
id generator:'identity', name:'fileId', column:'file_id'
objectIdStorageObject column:'object_id'
}
Integer fileId
StorageObject objectIdStorageObject
static constraints = {
fileId(max: 2147483647)
objectIdStorageObject()
}
String toString() {
return "${fileId}"
}
我用脚手架生成了控制器和视图。由于以下项目,生成的视图中的链接不起作用:
<td><g:link action="show" id="${storageFileInstance.id}">${fieldValue(bean: storageFileInstance, field: "fileId")}</g:link></td>
id=${storageFileInstance.id}
虽然我可以通过用替换来解决这个问题id=${storageFileInstance.fileId}
。
然后出现了另一个问题,即使我只是手动转到 /TestTmm/StorageFile/show/362 之类的 url,也很明显。Grails 会产生如下错误:
Error 500: Internal Server Error
URI /TestTmm/storageFile/show/362
Class org.hibernate.TypeMismatchException
Message Provided id of the wrong type for class tmmweb.StorageFile.
Expected: class java.lang.Integer, got class java.lang.Long`
提供给控制器的 params.id 本身显示以下操作:
def show() {
def storageFileInstance = StorageFile.get(params.id)
是一个字符串,我可以用它来检查println "${params.id.getClass()}
,但不知何故,这在 Hibernate 中以 Long 形式结束,而不是 Integer。很不清楚为什么?
id 字段名为“id”的类似类没有这个问题。
class Role {
static mapping = {
table 'role'
version false
usersList column:'rid',joinTable:'users_roles'
id generator:'identity', column:'rid'
}
Integer id
String name
static hasMany = [ usersList : User ]
static belongsTo = [User]
static constraints = {
id(max: 2147483647)
name(size: 1..64, blank: false)
usersList()
}
String toString() {
return "${name}"
}
}
关于如何解决正在发生的休眠映射问题的任何想法?