代码之家  ›  专栏  ›  技术社区  ›  tinny

GORM inheritance issue

  •  3
  • tinny  · 技术社区  · 15 年前

    我被这个戈姆遗传问题所困扰,我很感激能有新的眼光来研究这个问题。(IM使用Grails 1.3.2)

    I have a base abstract class...

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

    and I want to extend it like so...

    class OneOffSchedule extends MaintenanceSchedule {
    
        Date scheduleDate
    
        static constraints = {
            scheduleDate(nullable:false)
        }
    
        private static OneOffSchedule getReferenceOneOffSchedule() {
            return new OneOffSchedule(scheduleDate:new Date())
        }
    }
    

    when I try and run my application I get the following stack trace.

    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 回复  |  直到 14 年前
        1
  •  2
  •   chrislatimer    15 年前

    The problem is arguably a bug in gorm (maybe hibernate, not sure where the root of the bug lies) in that it does not persist abstract classes and breaks polymorphic relationships . Presumably you've got a

    static hasMany = [schedules:MaintenanceSchedule]
    

    in your MaintenanceTask class. If your MaintenanceSchedule class is really just like it appears in your post, you can work around the problem by removing the abstract descriptor on the class. If you want to prevent someone from creating a MaintenanceSchedule you can explicitly add a protected no argument constructor.

    If you want to have abstract methods in the MaintenanceSchedule then the approach doesn't work so well. But, if you either remove the abstract keyword or the relationship on MaintenanceTask your compiler error should go away.

        2
  •  0
  •   Joaquín M pcrews    14 年前

    In Grails version 1.4 this is going to be solved. It's actually solved... but we have to wait to the 1.4 stable version be released.

    http://jira.grails.org/browse/GRAILS-2583