我有一个名为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域类,因为我真正需要跟踪的是整数标识符。
答案 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列是其值。对于那些能够避免它的人,我建议不要这样做。创建新的域对象要简单得多。