[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-3526) hbm2ddl.auto validate error on sequences in different schema

Steve Krall (JIRA) noreply at atlassian.com
Thu Jul 29 12:39:35 EDT 2010


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3526?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=37947#action_37947 ] 

Steve Krall commented on HHH-3526:
----------------------------------

I was having the same issue with 3.2.6.ga.  I was able to work around the issue by extending the Oracle10gDialect, and overriding the getQuerySequencesString() method.  Something like:

public class OracleSequenceDialect extends Oracle10gDialect {

    @Override
    public String getQuerySequencesString() {
        return "select sequence_name from all_sequences";
    }
}

This isn't a perfect fix, but it does work like some of the other dialects.

USER_SEQUENCES: Description of the user's own SEQUENCEs
ALL_SEQUENCES: Description of SEQUENCEs accessible to the user

So, in this case, it makes more sense to use ALL_SEQUENCES.  ALL_SEQUENCES may be better in all circumstances, but I'll let someone with more knowledge determine that.

> hbm2ddl.auto validate error on sequences in different schema
> ------------------------------------------------------------
>
>                 Key: HHH-3526
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3526
>             Project: Hibernate Core
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 3.3.1
>         Environment: Hibernate 3.3.1 GA & Oracle 9i Database
>            Reporter: Andres Galeano
>
> Hello,
> My situation is that I have an persistent object and matching hbm that reference a table and sequence in a different oracle schema. When I set the "hibernate.hbm2ddl.auto" property to "validate", a hibernate error message claims that the sequence does not exist, although it does and is accessible.
> From stepping through the code
> in class: org.hibernate.tool.hbm2ddl.DatabaseMetadata
> in method: public boolean isSequence(Object key)
> This code parses the 'key', in this case sequence name, by '.' and searches to see if the last element is contained in the list of sequences. So if I prefix my sequence name with the schema name it belongs to, it's ignored. This doesn't seem right to me.
> The code also seems to ignore the "schema" attribute of the "hibernate-mapping/class" element when validating sequence generators. To me this seems wrong as well.
> Since the 'list of sequences' is only for the current schema, at least in the case of Oracle9Dialect, the validate fails, even though the sequence does exist and seems to be properly specified to me.
> ------------------------------------------------------------
> Excerpt from my hbm.xml file:
> ------------------------------------------------------------
> ...
> ...
> <hibernate-mapping>
>    <class name="bus.Accesspurpose" table="ACCESSPURPOSE" schema="WISH">
>        <id name="id" type="int">
>            <column name="ACCESSPURPOSEID" />
>            <generator class="sequence">
>                <!-- Prefixed with schema for database validation. -->
>             <param name="sequence">WISH.SEQ_ACCESSPURPOSEID</param>
>            </generator>
>        </id>
> ...
> ...
> ------------------------------------------------------------
> Full stack trace.
> ------------------------------------------------------------
> 2008-10-08 10:47:15,375 ERROR Thread-1 org.springframework.web.context.ContextLoader - Context initialization failed
> org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SecurityManager' defined in class path resource [bus/wishdb-service-context.xml]: Cannot resolve reference to bean 'SecurityManagerDao' while setting bean property 'securityManagerDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SecurityManagerDao' defined in class path resource [db/wishdb-data-context.xml]: Cannot resolve reference to bean 'mySessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory' defined in class path resource [db/pp-app-data-context.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Missing sequence or table: WISH.SEQ_ACCESSPURPOSEID
>    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
>    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1172)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:940)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:437)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)
>    at java.security.AccessController.doPrivileged(Native Method)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)
>    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
>    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
>    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
>    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
>    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:400)
>    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:736)
>    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:369)
>    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:261)
>    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
>    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
>    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3764)
>    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4216)
>    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:760)
>    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:740)
>    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:544)
>    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:825)
>    at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:714)
>    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:490)
>    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
>    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
>    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
>    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1022)
>    at org.apache.catalina.core.StandardHost.start(StandardHost.java:736)
>    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1014)
>    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
>    at org.apache.catalina.core.StandardService.start(StandardService.java:448)
>    at org.apache.catalina.core.StandardServer.start(StandardServer.java:700)
>    at org.apache.catalina.startup.Catalina.start(Catalina.java:552)
>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>    at java.lang.reflect.Method.invoke(Method.java:585)
>    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
>    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)
> Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SecurityManagerDao' defined in class path resource [db/wishdb-data-context.xml]: Cannot resolve reference to bean 'mySessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory' defined in class path resource [db/pp-app-data-context.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Missing sequence or table: WISH.SEQ_ACCESSPURPOSEID
>    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
>    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1172)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:940)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:437)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)
>    at java.security.AccessController.doPrivileged(Native Method)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)
>    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
>    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
>    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
>    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
>    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
>    ... 41 more
> Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mySessionFactory' defined in class path resource [db/pp-app-data-context.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Missing sequence or table: WISH.SEQ_ACCESSPURPOSEID
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1260)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:438)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:383)
>    at java.security.AccessController.doPrivileged(Native Method)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:353)
>    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:245)
>    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:169)
>    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:242)
>    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
>    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
>    ... 53 more
> Caused by: org.hibernate.HibernateException: Missing sequence or table: WISH.SEQ_ACCESSPURPOSEID
>    at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1127)
>    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:139)
>    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:349)
>    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1327)
>    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:799)
>    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:733)
>    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1288)
>    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1257)
>    ... 62 more
> -----------------------------------------------------------
> _________________
> Thanks,
> - Andy
> See also the forums post:
> http://forum.hibernate.org/viewtopic.php?t=991326

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list