grails:如何使用复合ForeignKey

时间:2015-05-07 15:41:25

标签: grails gorm

我有一个预先存在的数据库,其中包含两个表FileContainer和FileObjects。 FileContainer具有clientId和fileContainerId的复合主键。 FileContainerId对每个客户端都是唯一的。 FileObjects还具有clientId(FileContainerClientId)和fileObjectId的复合主键。 FileContainer和FileObjects具有一对多的关系。外键关系具有多个列(clientId和fileContainerId)。所以我的Domain类看起来如下。

class FileContainer implements Serializable {

  BigDecimal clientId
  BigDecimal fileContainerId
  ...
  ...
  static hasMany = [fileObjects: FileObject]

  static mapping = {
    table 't_container'
    id composite : ["clientId", "fileContainerId"]
  }
}

class FileObject implements Serializable {

  BigDecimal FileContainerClientId
  BigDecimal fileObjectId
  FileContainer fileContainerId
  ...
  ...
  static belongsTo = [FileContainer]

  static mapping = {
    table 't_file_object'
    id composite : ["FileContainerClientId", "fileContainerId"]
    column fileContainerId: 'custom_name_container_id'
    column FileContainerClientId: 'client_id'
  }
}

但遗憾的是,上面的Domain类未通过验证,并使用文本org.hibernate.MappingException提供以下异常:'实体映射中的重复列:FileObject列:file_container_client_id(应使用insert =“false”update =“false”映射) )”。

我尝试使用由列组成的自定义UserType(client_id和file_container_id)。但是有各种不同的错误。

在这种情况下应该如何创建域类?

另外,如果有人可以举例说明使用org.hibernate.usertype.UserType会有所帮助。

=============================================== ================ 还在FileObject类中尝试了以下内容。

class FileObject implements Serializable {

  BigDecimal clientId
  BigDecimal fileObjectId
  BigDecimal fileContainerId
  ...
  ...
  static belongsTo = [fileContainer: FileContainer]

  static mapping = {
    table 'file_object'
    id composite : ["FileContainerClientId", "fileContainerId"]
    column fileContainerId: 'custom_name_container_id'
    column clientId: 'client_id'
    fileContainer column: 'client_id'
    fileContainer column: 'file_container_id'
  }
}

但是缺少了file_container_client_id列异常。

=============================================== ========================== 由于Object类中的FileContainerClientId是Container类中clientId的外键,因此不应该直接插入或更新它,它应该始终来自FileContainer类。按照上述逻辑,我尝试添加以下映射

static mapping = { 
  FileContainerClientId insertable: false 
  FileContainerClientId updateable: false 
}

但编译失败,因为属性名称以大写字母开头。如果我将属性名称更改为fileContainerClientId,那么它将编译但不能将列映射到foreignKey并在验证期间抛出缺少的file_container_client_id列异常

1 个答案:

答案 0 :(得分:0)

以下代码可用于映射此类案例。

DataTemplate