Details
-
Type:
Bug
-
Status:
Closed
-
Priority:
Critical
-
Resolution: Fixed
-
Affects Version/s: 0.2
-
Fix Version/s: 0.2
-
Component/s: Configuration, Persistence
-
Labels:None
-
Environment:HSQL, PostgreSQL databases tested.
-
Testcase included:yes
Description
We have groovy Domain classes, which are to be mapped, not by GORM, but directly with Hibernate hbm.xml files.
When satrting the application, grails tries to map the domain classes twice. When it does the second time, a DuplicateMappingException occurs.
Excerpt from the log:
{{
[groovy] configuring from url: file:/C:/dev/dup/tmp/war/WEB-INF/classes/hibernate.cfg.xml
[groovy] Reading mappings from resource: Author.hbm.xml
[groovy] Mapping class: Author -> author
[groovy] Reading mappings from resource: Book.hbm.xml
[groovy] Mapping class: Book -> book
[groovy] Configured SessionFactory: null
[groovy] Building new Hibernate SessionFactory
[groovy] [GrailsDomainBinder] Mapping Grails domain class: Author -> AUTHOR
[groovy] [GrailsDomainBinder] bound property [org.codehaus.groovy.grails.commons.DefaultGrailsDomainClassProperty@191f022[name=id,type=class java.lang.Long,persistent=true,optional=false,association=false,bidirectional=false,association-type=<null>]] to column name [ID]
[groovy] [GrailsDomainBinder] Set cascading strategy on property [id] to [null]
[groovy] [GrailsDomainBinder] bound property [org.codehaus.groovy.grails.commons.DefaultGrailsDomainClassProperty@2c5444[name=version,type=class java.lang.Long,persistent=true,optional=false,association=false,bidirectional=false,association-type=<null>]] to column name [VERSION]
[groovy] [GrailsDomainBinder] Set cascading strategy on property [version] to [null]
[groovy] [GrailsDomainBinder] Binding persistent property [name]
[groovy] [GrailsDomainBinder] bound property [org.codehaus.groovy.grails.commons.DefaultGrailsDomainClassProperty@c74fe[name=name,type=class java.lang.String,persistent=true,optional=false,association=false,bidirectional=false,association-type=<null>]] to column name [NAME]
[groovy] [GrailsDomainBinder] Set cascading strategy on property [name] to [null]
[groovy] Destroying singletons in factory {org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [customEditors,exceptionHandler,multipartResolver,messageSource,localeChangeInterceptor,localeResolver,dataSource,sessionFactory,transactionManager,AuthorDomainClass,AuthorPersistentClass,AuthorValidator,BookDomainClass,BookPersistentClass,BookValidator,simpleGrailsController,jspViewResolver,handlerMappingTargetSource,openSessionInViewInterceptor,handlerMapping,AuthorControllerClass,AuthorControllerTargetSource,AuthorControllerProxy,AuthorController,BookControllerClass,BookControllerTargetSource,BookControllerProxy,BookController,ValidationTagLibClass,ValidationTagLibTargetSource,ValidationTagLibProxy,ValidationTagLib,JavascriptTagLibClass,JavascriptTagLibTargetSource,JavascriptTagLibProxy,JavascriptTagLib,FormTagLibClass,FormTagLibTargetSource,FormTagLibProxy,FormTagLib,RenderTagLibClass,RenderTagLibTargetSource,RenderTagLibProxy,RenderTagLib,UITagLibClass,UITagLibTargetSource,UITagLibProxy,UITagLib,ApplicationTagLibClass,ApplicationTagLibTargetSource,ApplicationTagLibProxy,ApplicationTagLib,AuthorScaffoldDomain,AuthorControllerScaffolder,BookScaffoldDomain,BookControllerScaffolder]; parent: org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [grailsApplication,grailsResourceHolder,characterEncodingFilter]; root of BeanFactory hierarchy}
[groovy] Context initialization failed [groovy] org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in resource loaded through InputStream: Initialization of bean failed; nested exception is org.hibernate.DuplicateMappingException: Duplicate class/entity mapping Author
[groovy] org.hibernate.DuplicateMappingException: Duplicate class/entity mapping Author
[groovy] at org.hibernate.cfg.Mappings.addClass(Mappings.java:118)
[groovy] at org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder.bindRoot(GrailsDomainBinder.java:327)
[groovy] at org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder.bindClass(GrailsDomainBinder.java:278)
[groovy] at org.codehaus.groovy.grails.orm.hibernate.cfg.DefaultGrailsDomainConfiguration.secondPassCompile(DefaultGrailsDomainConfiguration.java:118)
[groovy] at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1168)
[groovy] at org.codehaus.groovy.grails.orm.hibernate.cfg.DefaultGrailsDomainConfiguration.buildSessionFactory(DefaultGrailsDomainConfiguration.java:88)
[groovy] at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:800)
[groovy] at org.springframework.orm.hibernate3.LocalSessionFactoryBean.afterPropertiesSet(LocalSessionFactoryBean.java:726)
[groovy] at org.codehaus.groovy.grails.orm.hibernate.ConfigurableLocalSessionFactoryBean.afterPropertiesSet(ConfigurableLocalSessionFactoryBean.java:92)
[groovy] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1059)
[groovy] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:363)
[groovy] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:226)
[groovy] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:147)
[groovy] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:269)
[groovy] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:320)
[groovy] at org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.refresh(AbstractRefreshableWebApplicationContext.java:134)
[groovy] at org.springmodules.beans.factory.drivers.xml.XmlWebApplicationContextDriver.getWebApplicationContext(XmlWebApplicationContextDriver.java:54)
[groovy] at org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet.createWebApplicationContext(GrailsDispatcherServlet.java:78)
[groovy] at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:250)
[groovy] at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:219)
[groovy] at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:112)
[groovy] at javax.servlet.GenericServlet.init(GenericServlet.java:168)
[groovy] at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:383)
[groovy] at org.mortbay.jetty.servlet.ServletHolder.start(ServletHolder.java:243)
[groovy] at org.mortbay.jetty.servlet.ServletHandler.initializeServlets(ServletHandler.java:446)
[groovy] at org.mortbay.jetty.servlet.WebApplicationHandler.initializeServlets(WebApplicationHandler.java:321)
[groovy] at org.mortbay.jetty.servlet.WebApplicationContext.doStart(WebApplicationContext.java:511)
[groovy] at org.mortbay.util.Container.start(Container.java:72)
[groovy] at org.mortbay.http.HttpServer.doStart(HttpServer.java:753)
[groovy] at org.mortbay.util.Container.start(Container.java:72)
[groovy] at gjdk.org.mortbay.jetty.Server_GroovyReflector.invoke(Unknown Source)
[groovy] at groovy.lang.MetaMethod.invoke(MetaMethod.java:111)
[groovy] at org.codehaus.groovy.runtime.MetaClassHelper.doMethodInvoke(MetaClassHelper.java:652)
[groovy] at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:343)
[groovy] at org.codehaus.groovy.runtime.Invoker.invokeMethod(Invoker.java:144)
[groovy] at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:104)
[groovy] at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod(ScriptBytecodeAdapter.java:85)
[groovy] at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeNoArgumentsMethod(ScriptBytecodeAdapter.java:175)
[groovy] at Script1.run(Script1.groovy:11)
[groovy] at org.codehaus.groovy.ant.Groovy.execGroovy(Groovy.java:455)
[groovy] at org.codehaus.groovy.ant.Groovy.execute(Groovy.java:349)
[groovy] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[groovy] at org.apache.tools.ant.Task.perform(Task.java:364)
[groovy] at org.apache.tools.ant.Target.execute(Target.java:341)
[groovy] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[groovy] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[groovy] at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:37)
[groovy] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[groovy] at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:382)
[groovy] at org.apache.tools.ant.taskdefs.CallTarget.execute(CallTarget.java:107)
[groovy] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
[groovy] at org.apache.tools.ant.Task.perform(Task.java:364)
[groovy] at org.apache.tools.ant.Target.execute(Target.java:341)
[groovy] at org.apache.tools.ant.Target.performTasks(Target.java:369)
[groovy] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1216)
[groovy] at org.apache.tools.ant.Project.executeTarget(Project.java:1185)
[groovy] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:40)
[groovy] at org.apache.tools.ant.Project.executeTargets(Project.java:1068)
[groovy] at org.apache.tools.ant.Main.runBuild(Main.java:668)
[groovy] at org.apache.tools.ant.Main.startAnt(Main.java:187)
[groovy] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:246)
[groovy] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:67)
}}
The test case can be replicated by
-creating the grails app dup,
-copying the into the newly created app
-domain classes
-controllers
-hibernate config
-grails run-app