Вопрос наследства ГОРМ - PullRequest
3 голосов
/ 26 июня 2010

Я заблокирован этой проблемой наследования GORM, которую я имею, и я благодарен за свежие взгляды, чтобы взглянуть на эту проблему. (Я использую Grails 1.3.2)

У меня есть базовый абстрактный класс ...

abstract class MaintenanceSchedule {
    static belongsTo = [ maintenanceTask:MaintenanceTask ]
}

и я хочу расширить его так ...

class OneOffSchedule extends MaintenanceSchedule {

    Date scheduleDate

    static constraints = {
        scheduleDate(nullable:false)
    }

    private static OneOffSchedule getReferenceOneOffSchedule() {
        return new OneOffSchedule(scheduleDate:new Date())
    }
}

при попытке запустить приложение я получаю следующую трассировку стека.

2010-06-26 12:01:43,090 [main] ERROR context.GrailsContextLoader  - Error executing bootstraps: Error creating bean with name 'messageSource': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: An association from the table maintenance_task refers to an unmapped class: preventIT.maintenance.MaintenanceSchedule
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageSource': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: An association from the table maintenance_task refers to an unmapped class: preventIT.maintenance.MaintenanceSchedule
        at org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:164)
        at grails.web.container.EmbeddableServer$start.call(Unknown Source)
        at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy:159)
        at _GrailsRun_groovy$_run_closure5_closure12.doCall(_GrailsRun_groovy)
        at _GrailsSettings_groovy$_run_closure10.doCall(_GrailsSettings_groovy:282)
        at _GrailsSettings_groovy$_run_closure10.call(_GrailsSettings_groovy)
        at _GrailsRun_groovy$_run_closure5.doCall(_GrailsRun_groovy:150)
        at _GrailsRun_groovy$_run_closure5.call(_GrailsRun_groovy)
        at _GrailsRun_groovy.runInline(_GrailsRun_groovy:116)
        at _GrailsRun_groovy.this$4$runInline(_GrailsRun_groovy)
        at _GrailsRun_groovy$_run_closure1.doCall(_GrailsRun_groovy:59)
        at RunApp$_run_closure1.doCall(RunApp.groovy:33)
        at gant.Gant$_dispatch_closure5.doCall(Gant.groovy:381)
        at gant.Gant$_dispatch_closure7.doCall(Gant.groovy:415)
        at gant.Gant$_dispatch_closure7.doCall(Gant.groovy)
        at gant.Gant.withBuildListeners(Gant.groovy:427)
        at gant.Gant.this$2$withBuildListeners(Gant.groovy)
        at gant.Gant$this$2$withBuildListeners.callCurrent(Unknown Source)
        at gant.Gant.dispatch(Gant.groovy:415)
        at gant.Gant.this$2$dispatch(Gant.groovy)
        at gant.Gant.invokeMethod(Gant.groovy)
        at gant.Gant.executeTargets(Gant.groovy:590)
        at gant.Gant.executeTargets(Gant.groovy:589)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: An association from the table maintenance_task refers to an unmapped class: preventIT.maintenance.MaintenanceSchedule
        ... 23 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Invocation of init method failed; nested exception is org.hibernate.MappingException: An association from the table maintenance_task refers to an unmapped class: preventIT.maintenance.MaintenanceSchedule
        ... 23 more
Caused by: org.hibernate.MappingException: An association from the table maintenance_task refers to an unmapped class: preventIT.maintenance.MaintenanceSchedule
        ... 23 more

Ответы [ 2 ]

2 голосов
/ 27 июня 2010

Возможно, проблема заключается в ошибке в gorm (может быть в спящем режиме, не уверенной, где лежит корень ошибки), поскольку она не сохраняет абстрактные классы и нарушает полиморфные отношения.Предположительно, у вас есть

static hasMany = [schedules:MaintenanceSchedule]

в вашем классе MaintenanceTask.Если ваш класс MaintenanceSchedule действительно такой же, как и в вашем посте, вы можете обойти эту проблему, удалив абстрактный дескриптор класса.Если вы хотите запретить кому-либо создавать MaintenanceSchedule, вы можете явно добавить защищенный конструктор без аргументов.

Если вы хотите иметь абстрактные методы в MaintenanceSchedule, тогда этот подход не работает так хорошо.Но если вы удалите ключевое слово abstract или отношение в MaintenanceTask, ваша ошибка компилятора должна исчезнуть.

0 голосов
/ 04 июня 2011

В Grails версии 1.4 это будет решено.Это на самом деле решено ... но мы должны дождаться выпуска стабильной версии 1.4.

...