Я использую Grails 2 для предоставления интерфейса в устаревшей базе данных с настраиваемыми полями идентификатора.
У меня есть класс домена, подобный следующему:
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}
.
Затем появляется еще одна проблема, которая очевидна, даже если я просто вручную перехожу по URL-адресу, например /TestTmm/StorageFile/show/362 . 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}"
}
}
Любые идеи о том, как исправить то, что должно быть проблемой с отображением гибернации, которое происходит?
Long fileId
, то ошибки нет. Это происходит даже в том случае, если я устанавливаю тип столбца в блоке сопоставления на «целое число». Таким образом, создается впечатление, что сгенерированный метод StorageFile.get должен каким-то образом преобразовываться в Long перед сопоставлением. - person Peter N. Steinmetz   schedule 03.09.2012