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