带有自定义id字段的Grails 2 GORM在show动作中抱怨“为类提供了错误类型的id”

时间:2012-09-03 00:11:03

标签: grails gorm grails-2.0

我使用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这样的网址。 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)

是一个String,我可以用println "${params.id.getClass()}检查,但不知何故,这最终会在Hibernate中以Long结尾,而不是整数。目前还不清楚为什么?

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}" 
  }

}

关于如何解决正在发生的hibernate映射必然存在问题的任何想法?

1 个答案:

答案 0 :(得分:1)

我认为你不应该将id的名称定义为'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 }