我有一个名为FoapRequest的域类。我希望其中一个称为“批准人”的属性为整数列表。顺序很重要,因此我已将http://grails.org/doc/latest/guide/GORM.html#sets,ListsAndMaps描述的类定义为列表:
class FoapRequest {
Integer requester
Integer subject
List approver
static hasMany = [foap:FOAP, newFoap:NewFoap, approver:Integer]
...
仅作说明,FOAP和NewFoap是另外两个域对象。
我需要将此类映射到Oracle数据库中的特定表,因此我还要使用连接表指定静态映射:
static mapping = {
table 'OUR_SCHEMA.FOAP_REQUEST_TABLE
id column : 'ID', generator:'sequence', params: [sequence:'OUR_SCHEMA.FOAP_REQUEST_SEQ']
requester column : 'REQUESTER'
subject column : 'SUBJECT'
approver indexColumn: [name: "APPROVER_IDX"], generator:'sequence', params: [sequence:'OUR_SCHEMA.APPROVER_SEQ'],
joinTable: [name:'OUR_SCHEMA.APPROVER_TABLE',
key: 'ASSOCIATED_REQUEST',
column: 'APPROVER_PIDM',
type: "integer"
]
但是,当我尝试创建FoapRequest对象的新实例时,出现以下错误:
Invalid column type
控制台显示以下内容:
Error 2012-08-01 12:29:31,619 [http-bio-8080-exec-9] ERROR errors.GrailsExceptionResolver - SQLException occurred when processing request: [POST] /FOAPauth/foapRequest/saveFoapRequests - parameters:
我敢肯定,问题在于联合党。域模型最初不包括joinTable-批准者只是一个Integer类型(我太晚意识到我需要跟踪多个批准者)。
这是用于创建APPROVERS表的SQL:
CREATE TABLE "OUR_SCHEMA"."APPROVER_TABLE"
(
"APPROVER_IDX" NUMBER(*,0) NOT NULL ENABLE,
"ASSOCIATED_REQUEST" NUMBER(*,0) NOT NULL ENABLE,
"APPROVER_PIDM" NUMBER(8),
);
我宁愿尽可能避免创建Approver域类,因为我真正需要跟踪的只是整数标识符。
最佳答案
因此,在对联接表进行了很多调整之后,我确定满足我的需求的最佳方法是在域模型中简单地创建一个Approver对象。
class Approver {
Integer pidm
String approvalDecision
Date lastUpdated
Date dateCreated
static belongsTo = [foap: FOAP]
}
老实说,我不太确定为什么我这么努力避免这种情况。可能是因为我的DBA对表定义使用了版本控制系统,所以我觉得很烦。 :)
无论如何,域类之间的简单一对多关系可以满足我的所有需求,而无需联接表。
对于那些仍然不知所措的人,我确实设法使用Map获得了一个静态映射的联接表,该表更适合我的需要(尽管不像新的域类那样适合他们,并且不那么简单) 。
我最终在另一个域对象FOAP而不是FoapRequest中完成了它:
import java.util.Map
class FOAP {
...
Map approvalData
...
static mapping = {
table 'OURSCHEMA.FOAP_TABLE'
id column : 'ID', generator:'jpl.hibernate.util.TriggerAssignedIdentityGenerator'
fund column : 'FUND'
org column : 'ORG'
chartOfAccounts column : 'CHART_OF_ACCOUNTS'
permissionType column: 'PERMISSION_TYPE'
foapRequest column: 'REQUEST_ID'
version column : 'VERSION'
approvalData joinTable: [name:'OURSCHEMA.FOAP_APPROVERS',
key: 'FOAP'
]
}
对于表定义,我使用了与原始问题中相似的列名。
CREATE TABLE "OUR_SCHEMA"."APPROVER_TABLE"
(
"FOAP" NUMBER(*,0) NOT NULL ENABLE,
"APPROVER_IDX" VARCHAR2(255),
"APPROVER_DLT" NUMBER(8),
);
IDX列是 map 对象的键,而DLT列是其值。对于任何可以避免的人,我建议不要采用这种方法。创建一个新的域对象要简单得多。