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

时间:2012-08-01 17:35:54

标签: grails gorm

我有一个名为FoapRequest的域类。我想要一个名为“approver”的属性作为整数列表。订单很重要,所以我将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--批准者只是一个整数类型(我意识到我需要跟踪多个批准者太晚了。)

这是用于创建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域类,因为我真正需要跟踪的是整数标识符。

1 个答案:

答案 0 :(得分:1)

因此,在对联接表进行大量淘汰后,我确定处理我需求的最佳方法是在我的域模型中创建一个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列是地图对象的键,DLT列是其值。对于那些能够避免它的人,我建议不要这样做。创建新的域对象要简单得多。