Grails定义映射属性有很多关系

时间:2013-12-05 09:39:24

标签: grails mapping gorm many-to-one

我有两个具有许多映射的域类。

一堂课:

class Line  {

static belongsTo = [header : Header]

Long invoiceId
Long lineNumber
Long oneId
Long secondId
Long thirdId

static mapping = {
    table('LINES_2_V')
    version(false)
    id composite: ['invoiceId', 'lineNumber']
}

}

另一堂课:

class Header {

static hasMany = [lines: Line]
Long id

static mapping = {
    table('HEADERS_2_V')
    version(false)
    id column:'INVOICE_ID'
}

}

Createria:

Header.createCriteria().list() {

createAlias('Lines', 'l', CriteriaSpecification.INNER_JOIN)

if (oneId) {
    eq('l.oneId', oneId)
} else {
    isNull('l.oneId')
}
if (secondId) {
    eq('l.secondId', secondId)
}else {
    isNull('l.secondId')
}
if (thirdId) {
    eq('l.thirdId', thirdId)
}else {
    isNull('l.thirdId')
}

}

我得到以下错误:

ORA-00904: "L1_"."HEADER_ID": invalid identifier

Hibernate生成的select看起来像这样:

Hibernate: select * from ( select this_.INVOICE_ID as INVOICE1_0_1_
from HEADERS_2_V this_, 
LINES_2_V ihl1_ where this_.INVOICE_ID=l1_.header_id and ihl1_.project_id is null 
and ihl1_.transaction_id is null and ihl1_.po_header_id is null ) where rownum <= ?

为什么它试图按HEADER_ID进行映射?如何按INVOICE_ID进行映射?

1 个答案:

答案 0 :(得分:3)

因为这是您对Line表中存储的Header的后引用。你的表是这样的:

  

Lines_2_V:invoice_id,line_number, header_id ,one_id,second_id,thid_id

     

Header_2_V:invoice_id

由于Gorm已经将Header的id存储在Line表中,因此使用它来加入它们。

当您将belongTo作为地图时:

static belongsTo = [header : Header]

Grails / Gorm会在你的表格中创建一个后向引用。您也可以使用

 static belongsTo =  Header

哪个gorm创建中间表来加入它们 有关更多信息,请参阅Peter Ledbrook

中的GORM Gotchas文章

btw,Lines应为lines

createAlias('Lines', 'l', CriteriaSpecification.INNER_JOIN)

应该是

createAlias('lines', 'l', CriteriaSpecification.INNER_JOIN)