2

我有一个名为 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——批准者只是一个整数类型(我意识到我需要跟踪多个批准者为时已晚)。

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

4

1 回答 1

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 列是它的值。对于任何可以避免它的人,我建议不要使用这种方法。创建一个新的域对象要简单得多。

于 2012-08-13T19:22:30.997 回答