grails - grails:如何使用复合ForeignKey映射一对多关系

标签 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”)。

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

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

另外,如果有人可以提供使用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列异常

最佳答案

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

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

  }
}

关于grails - grails:如何使用复合ForeignKey映射一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30105796/

相关文章:

java - 返回大型结果集时 Grails findAll 变慢

grails - Remote 插件可以与Grails 3一起使用吗?

grails - Grails: View 模板中的分页和排序问题

grails - 如何在Grails Controller 中创建动态单选按钮

forms - Grails 具有动态表单的一对多数据绑定(bind)

linux - grails 应用程序不会在 tomcat 上部署失败 - 应用程序无法启动

grails - Grails域类的静态属性hasOne,hasMany和belongsTo

hibernate - 将Hibernate/Grails域对象保留在 session 中

grails - Grails-自引用关系

grails - Grails/GORM中的错误:删除的对象将通过级联重新保存