2

FoapRequestというドメインクラスがあります。「承認者」と呼ばれるプロパティの1つを整数のリストにします。順序が重要なので、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は他の2つのドメインオブジェクトです。

このクラスを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),
    );

私が本当に追跡する必要があるのは整数識別子だけなので、可能な限り承認者ドメインクラスを作成することは避けたいと思います。

4

1 に答える 1

1

そのため、結合テーブルを何度も試した結果、自分のニーズに対処する最善の方法は、ドメイン モデルに Approver オブジェクトを単純に作成することであると判断しました。

class Approver {

Integer pidm
String  approvalDecision
Date lastUpdated
Date dateCreated

static belongsTo = [foap: FOAP]
}

正直なところ、なぜこれを避けるために一生懸命努力していたのか、よくわかりません。おそらく、私の DBA がテーブル定義にバージョン管理システムを使用しているため、私は非常に面倒だと感じています。:)

いずれにせよ、ドメイン クラス間の単純な 1 対多の関係は私のニーズをすべて満たし、結合テーブルは必要ありませんでした。

まだ知りたいと思っている人のために、静的にマップされた結合テーブルを Map を使用して機能させることができました。これは私のニーズにより適していました (ただし、新しいドメイン クラスほど適切ではなく、それほど単純ではありませんでした)。 .

私は別のドメインオブジェクトでそれを行うことになりました-FoapRequestの代わりにFOAP:

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 に答える