Grails 将列表属性中的条目放入静态映射的joinTable

Grails 将列表属性中的条目放入静态映射的joinTable,grails,gorm,Grails,Gorm,我有一个名为FoapRequest的域类。我希望名为“approver”的属性之一是整数列表。顺序很重要,因此我将类定义为列表: class FoapRequest { Integer requester Integer subject List approver static hasMany = [foap:FOAP, newFoap:NewFoap, approver:Integer] ... 为了澄清,FOAP和NewFoap是另外两个域对象 我需要将此类

我有一个名为FoapRequest的域类。我希望名为“approver”的属性之一是整数列表。顺序很重要,因此我将类定义为列表:

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对象的新实例时,出现以下错误:
列类型无效

控制台显示以下内容:
错误2012-08-01 12:29:31619[http-bio-8080-exec-9]错误。GrailExceptionResolver-处理请求时发生SQLException:[POST]/FOAPauth/foapRequest/saveFoapRequests-参数:

我确信,问题在于可接合性。域模型最初没有包含joinTable-approver只是一个整数类型(我意识到我需要跟踪多个approver,这太晚了)

以下是用于创建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对表定义使用了版本控制系统,我觉得这很烦人。:)

无论如何,域类之间的简单一对多关系满足了我的所有需要,不需要联接表

对于那些仍想知道的人来说,我确实成功地使用映射获得了一个静态映射的联接表,这更适合我的需要(尽管不像新的域类那样适合他们,也不那么简单)

我最终在另一个域对象中执行了该操作-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列是映射对象的键,DLT列是映射对象的值。我建议反对这种做法,因为任何人都可以避免。创建一个新的域对象要简单得多