Grails 2 GORM с пользовательским полем идентификатора, жалующимся на предоставленный идентификатор неправильного типа для класса в действии показа

Я использую 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}" 
  }

}

Любые идеи о том, как исправить то, что должно быть проблемой с отображением гибернации, которое происходит?


person Peter N. Steinmetz    schedule 03.09.2012    source источник
comment
Некоторые дальнейшие эксперименты: Если я меняю тип поля на с Long fileId, то ошибки нет. Это происходит даже в том случае, если я устанавливаю тип столбца в блоке сопоставления на «целое число». Таким образом, создается впечатление, что сгенерированный метод StorageFile.get должен каким-то образом преобразовываться в Long перед сопоставлением.   -  person Peter N. Steinmetz    schedule 03.09.2012
comment
Возможно, это ошибка, поэтому я только что отправил отчет об этом jira: jira.grails.org/browse /GRAILS-9375   -  person Peter N. Steinmetz    schedule 03.09.2012


Ответы (1)


Я не думаю, что вы должны определять имя идентификатора как что-то еще, кроме «id». Вы можете добавить псевдоним для свойства 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', column:'file_id'
  objectIdStorageObject column:'object_id'
}

Integer id
StorageObject objectIdStorageObject

// if you want to add an alias for "id"
static transients = ['fileId']

public Integer getFileId() { id }
person Lari Hotari    schedule 03.09.2012
comment
Да, псевдоним, безусловно, может работать, спасибо, хотя я бы предпочел просто иметь возможность использовать идентификатор другого имени. В документации Grails есть много ссылок на то, чтобы сделать это с отображением гибернации, но это не работает. Похоже, что ошибка должна быть исправлена ​​в Grails или она должна четко указывать, что вы не можете изменить имя фактического поля с «id». - person Peter N. Steinmetz; 03.09.2012