2013-12-05 2 views
2

У меня есть два класса домена с множеством карт.Grails определяет свойство отображения в имеет много отношений

Один класс:

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 генерироваться выберите выглядит следующим образом:

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?

ответ

3

Потому что это ваша обратная ссылка на заголовок, которая хранится в таблице строк. Ваши таблицы, как это:

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

Header_2_V: invoice_id

Поскольку Горм уже имеет заголовок-х id хранится в линии таблицы , используя его, чтобы присоединиться к ним.

Если у вас есть belongTo как карта:

static belongsTo = [header : Header] 

Grails/Горм создаст обратную ссылку в таблице. Вы можете также использовать

static belongsTo = Header 

Какие Горм создает промежуточную таблицу присоединиться к ним для получения дополнительной информации обратитесь к статье GORM Gotchas по Peter Ledbrook


BTV, Lines должен быть lines:

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

должно быть

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

спасибо, вы открыли мне глаза, мне нужно было использовать однонаправленные отношения много к одному, потому что только заголовки заботятся о линиях. Из строки i не нужно добираться до заголовка. Спасибо, ты спас мне жизнь. – kuldarim

Смежные вопросы