2015-10-16 5 views
0

У меня есть 2 домена:Как получить экземпляр класса вместо его подкласса?

казус:

class Incident { 
    String title 
    String description 
} 

static mapping = { 
    tablePerHierarchy(false) 
} 

И IncidentWithTimers которые распространяется казус:

class IncidentWithTimers extends Incident { 
    int currentResponseTime 
    Date responseTimeEndDate 
} 

IncidentWithTimers не является фактической таблицы в базе данных, это вид базы данных.

Теперь, когда я пытаюсь получить экземпляр инцидентов от контроллера, он какой-то образом возвращает экземпляр IncidentWithTimers:

def index() { 
    Incident curIncident = Incident.get(params.incident) 
    println(curIncident.getClass())// "class IncidentWithTimers" 
} 

Поскольку эта область представляет собой вид, я отключил все модификации, бросая исключения в beforeInsert/Update/Delete, в классе IncidentWithTimers.

Когда я пытаюсь изменить и сохранить curIncident, он пытается получить доступ к beforeUpdate() и выдает ошибку, в то время как я никогда не хотел менять IncidentWithTimers в первую очередь.

Что я могу сделать по этому поводу?

+0

Идентификатор инцидента в 'params.incident' относится к экземпляру' Incident' или 'IncidentWithTimers'? –

+0

Ничего. params.incident получает значение инцидента из строки запроса. (Так url.com/?incident=1 вернется 1). – Ivar

+0

Я имею в виду, что, следуя вашему примеру, это инцидент с идентификатором 1 «Инцидент» или «ИнцидентВидТимеры»? Кроме того, являются ли идентификаторы, возвращаемые представлением, что «IncidentWithTimers» сопоставляется с той же таблицей, на которую сопоставляется «Инцидент»? Да, я подразумеваю, что оба должны иметь одно и то же идентификационное пространство имен. –

ответ

1

Проблема заключается в том, что представление включает в себя все Incident, а не их подмножество, как это происходит с подклассом. Как вы сказали, каждый IncidentWithTimers является Incident.

Решение состоит в том, чтобы либо использовать запрос вместо подкласса, либо сделать IncidentWithTimers независимым дублирующим классом, а не подклассом.

Я думаю, что первый вариант является лучшим вариантом, потому что цель понятна.

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