2014-12-05 84 views
2

这里是我的Spring配置对Hibernate片段休眠空指针在AbstractUserTypeHibernateIntegrator用户类型

<bean id="adminDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
     <property name="driverClassName" value="org.postgresql.Driver"/> 
     <property name="url" value="org.postgresql.Driver"/> 
     <property name="username" value="username"/> 
     <property name="password" value="password"/> 
    </bean> 


    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="adminDataSource"/> 
     <property name="packagesToScan" value = "mypackage.model"/> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> 
     </property> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.hbm2ddl.auto">true</prop> 
       <prop key="hibernate.dialect">${hibernate.sql.dialect}</prop> 
       <prop key="hibernate.connection.pool_size">${hibernate.connection.pool_size}</prop> 
       <prop key="hibernate.format_sql">true</prop> 
       <prop key="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</prop> 
       <prop key="hibernate.connection.driver_class">org.postgresql.Driver</prop> 
       <prop key="hibernate.multiTenancy">SCHEMA</prop> 
       <prop key="hibernate.tenant_identifier_resolver">mypackage.SchemaResolver</prop> 
       <prop key="hibernate.multi_tenant_connection_provider"mypackage.MultitenantConnectionProvider</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id = "transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 

这里是我的SchemaResolver类

public class SchemaResolver implements CurrentTenantIdentifierResolver { 

    @Override 
    public String resolveCurrentTenantIdentifier() { 
     return "public"; //TODO: Implement service to identify tenant like: userService.getCurrentlyAuthUser().getTenantId(); 
    } 

    @Override 
    public boolean validateExistingCurrentSessions() { 
     return false; 
    } 
} 

这是我的MultitenantConnectionProvider

public class MultitenantConnectionProvider implements MultiTenantConnectionProvider, ServiceRegistryAwareService { 

    private static final long serialVersionUID = 4368575201221677384L; 

    private C3P0ConnectionProvider connectionProvider = null; 

    @Override 
    public boolean supportsAggressiveRelease() { 
     return false; 
    } 

    @Override 
    public void injectServices(ServiceRegistryImplementor serviceRegistry) { 
     Map lSettings = serviceRegistry.getService(ConfigurationService.class).getSettings(); 

     connectionProvider = new C3P0ConnectionProvider(); 
     connectionProvider.injectServices(serviceRegistry); 
     connectionProvider.configure(lSettings); 
    } 

    @Override 
    public boolean isUnwrappableAs(Class clazz) { 
     return false; 
    } 

    @Override 
    public <T> T unwrap(Class<T> clazz) { 
     return null; 
    } 

    @Override 
    public Connection getAnyConnection() throws SQLException { 
     final Connection connection = connectionProvider.getConnection(); 
     return connection; 
    } 

    @Override 
    public Connection getConnection(String tenantIdentifier) throws SQLException { 
     final Connection connection = getAnyConnection(); 
     try { 
      connection.createStatement().execute("SET SCHEMA '" + tenantIdentifier + "'"); 
     } 
     catch (SQLException e) { 
      throw new HibernateException("Could not alter JDBC connection to specified schema [" + tenantIdentifier + "]", e); 
     } 
     return connection; 
    } 

    @Override 
    public void releaseAnyConnection(Connection connection) throws SQLException { 
     try { 
      connection.createStatement().execute("SET SCHEMA 'public'"); 
     } 
     catch (SQLException e) { 
      throw new HibernateException("Could not alter JDBC connection to specified schema [public]", e); 
     } 
     connectionProvider.closeConnection(connection); 
    } 

    @Override 
    public void releaseConnection(String tenantIdentifier, Connection connection) throws SQLException { 
     releaseAnyConnection(connection); 
    } 
} 

一旦运行我的应用程序是我得到的例外

java.lang.NullPointerException 
      at org.jadira.usertype.spi.shared.AbstractUserTypeHibernateIntegrator.use42Api(AbstractUserTypeHibernateIntegrator.java:80) 
      at org.jadira.usertype.spi.shared.AbstractUserTypeHibernateIntegrator.integrate(AbstractUserTypeHibernateIntegrator.java:61) 
      at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:312) 
      at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1857) 
      at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) 
      at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843) 
      at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398) 
      at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842) 
      at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) 
      at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:341) 
      at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) 
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1627) 
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1564) 
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:540) 
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
      at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:229) 
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 

      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
      at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:956) 
      at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:747) 
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480) 
      at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403) 
      at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) 
      at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106) 
      at org.eclipse.jetty.server.handler.ContextHandler.callContextInitialized(ContextHandler.java:798) 
      at org.eclipse.jetty.servlet.ServletContextHandler.callContextInitialized(ServletContextHandler.java:444) 
      at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:789) 
      at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:294) 
      at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1341) 
      at org.eclipse.jetty.maven.plugin.JettyWebAppContext.startWebapp(JettyWebAppContext.java:296) 
      at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1334) 
      at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:741) 
      at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:497) 
      at org.eclipse.jetty.maven.plugin.JettyWebAppContext.doStart(JettyWebAppContext.java:365) 
      at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
      at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
      at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) 
      at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
      at org.eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.java:163) 
      at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
      at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
      at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) 
      at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
      at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
      at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:132) 
      at org.eclipse.jetty.server.Server.start(Server.java:387) 
      at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:114) 
      at org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:61) 
      at org.eclipse.jetty.server.Server.doStart(Server.java:354) 
      at org.eclipse.jetty.maven.plugin.JettyServer.doStart(JettyServer.java:73) 
      at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) 
      at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.java:534) 
      at org.eclipse.jetty.maven.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.java:357) 
      at org.eclipse.jetty.maven.plugin.JettyRunMojo.execute(JettyRunMojo.java:167) 
      at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132) 
      at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) 
      at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
      at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
      at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116) 
      at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) 
      at 

org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) 
     at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120) 
     at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:347) 
     at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:154) 
     at org.apache.maven.cli.MavenCli.execute(MavenCli.java:582) 
     at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214) 
     at org.apache.maven.cli.MavenCli.main(MavenCli.java:158) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:483) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) 
     at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) 
2014-12-05 21:26:45.136:WARN:oejsh.RequestLogHandler:main: !RequestLog 

我使用Hibernate 4.3.6最终以约达时间2.4,Spring框架在4.1.1.RELEASE,JDK版本的javac 1.8.0_20,而我把PostgreSQL PostgreSQL驱动9.3-1102-jdbc41

+0

你能告诉我们你正在使用哪个版本的spring和hibernate吗? – M2je 2014-12-05 13:54:53

+0

看起来像“type”为空。我猜想你的一个实体没有正确映射。或者也许一个枚举或子类在某处失踪? – Zeki 2014-12-05 14:36:33

+0

@ M2je添加了有关我正在使用的版本的信息。我是否应该包含jadira用户类型版本? – user962206 2014-12-05 15:43:57

回答

1

我有相同的错误,使用Hibernate 4.3.6和Jadira usertype 4.0.0.GA.

我的猜测是库Jadira usertype 4.0.0.GA与Hibernate的多租户模式不兼容。

我的解决方案是删除usertype依赖项,显然不要在代码中使用它。 现在,您必须选择使用hibernate多租户或使用usertype。

有关详细信息,用户类型使用deprecaded API ConnectionProvider getConnectionProvider()因为MultiTenantConnectionProvider不是ConnectionProvider一个实例,返回多租户模式无效。在多租户模式下,不存在ConnectionProvider类型的服务。 Usertype应该使用JdbcConnectionAccess

我希望它会在下一个版本中修复。

+0

多租户的问题在Jadira 5.0.0.GA中解决。免责声明:我维护Jaira。 – 2015-12-15 01:26:02

0

这是Usertype 3.2.0.GA中引入的一种回归。降级到版本3.1.0.GA消除了这个例外。

有关错误报告,请参阅https://github.com/JadiraOrg/jadira/issues/19

+1

或者,升级到Jadira的5.0.0.GA解决了Hibernate 5.0的问题。免责声明:我维护Jadira。 – 2015-12-15 01:25:29

0

我同意@Chris Pheby,你可以通过将Jadira版本升级到5.0.0来修复它.GA