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

08-19 17:13