Grails:如何将与复合外国人相关的关系映射到许多关系



我有一个带有两个表FileContainer和FileObjects的预先存在的数据库。FileContainer具有ClientId和Filecontainerid的复合主要密钥。filecontainerid是每个客户端的唯一。FileObjects还具有ClientId(FileContainerClientID)和FileObjectID的复合主键。FileContainer和FileObjects具有一对下的关系。外国密钥关系是有多个列(clientId和filecontainerid)。因此我的域类看起来如下。

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

,但不幸的是,上面的域类上方失败了验证,并用文本org.hibernate.mappingexception给出以下异常:'entity映射中的重复列:fileObject列:file_container_client_id(应用insert =" insert =" false" false update =" false" false" false" false =" false"))'。

我尝试使用由列(client_id and 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列异常。

=====================================================================================由于对象类中的FileContainerClientID是在容器类中的clientId的外键,因此绝不应直接插入或更新,因此它应始终来自FileContainer类。通过上述逻辑,我尝试添加以下映射

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

但是,由于属性名称始于大写字母,因此编译失败了。如果我将属性名称更改为FileContainerClientID,则它将其编译,但无法将列映射到foreferkey,并在验证期间抛出了丢失的file_container_client_id列列

以下代码可用于映射此类情况。

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 clientId
  BigDecimal fileObjectId
  BigDecimal fileContainerId
  FileContainer fileContainer
  ...
  ...
  static belongsTo = [FileContainer]
  static mapping = {
    table 't_file_object'
    id composite : ["clientId", "fileObjectId"]
    columns {
        fileContainer {
            column name:'client_id'
            column name:'file_container_id'
        }
    }
    fileContainer insertable:false, updateable:false
  }
}

最新更新