我有一个带有两个表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/