我有一个预先存在的数据库,其中包含两个表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列异常
答案 0 :(得分:0)
以下代码可用于映射此类案例。
DataTemplate