2012-05-23 79 views
2

我在使用hibernate 4.1.3的新多租戶功能時遇到問題我使用的是Glassfish 3.1,JPA2和Hibernate 4.1.3作爲提供程序。休眠4.1.3多租戶空指針異常

這是我的persistence.xml

<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="AuroraServicePU" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>jdbc/sqlserver/Aurora</jta-data-source> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 
      <property name="hibernate.show_sql" value="false"/> 
      <property name="hibernate.default_batch_fetch_size" value="100"/> 
      <property name="hibernate.cache.use_second_level_cache" value="false"/> 
      <property name="hibernate.cache.use_query_cache" value="false"/> 
      <property name="hibernate.tenant_identifier_resolver" value="org.dna.aurora.web.TenantResolver" /> 
      <property name="hibernate.multiTenancy" value="DISCRIMINATOR" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

這是例外,我得到時嘗試部署應用程序。

信息:HCANN000001:Hibernate的共享註釋{} 4.0.1.Final信息: HHH000412:Hibernate的核心{} 4.1.3.Final信息:HHH000206:找不到 hibernate.properties信息:HHH000021:字節碼提供命名 :Javassist進行INFO:HHH000204:處理PersistenceUnitInfo [名: AuroraServicePU ...]重度:在調用異常類 org.glassfish.persistence.jpa.JPADeployer製備方法重度: 異常而製備該應用重度:日誌信息一片空白。 顯示java.lang.NullPointerException在 org.hibernate.engine.jdbc.internal.JdbcServicesImpl $ MultiTenantConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcServicesImpl.java:260) 在 org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java :117) 在 org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75) 在 org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159) 在 有機hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131) at 個org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:71) 在 org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2277) 在 org.hibernate.cfg.Configuration.buildSettings(配置的.java:2273) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1742) 在 org.hibernate.ejb.EntityManagerFactoryImpl(EntityManagerFactoryImpl.java:76) 在 org.hibernate.ejb。 .Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:905) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:890) 在 org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73) 在 org.glassfish.persistence.jpa.PersistenceUnitLoader.loadPU(PersistenceUnitLoader.java:205) 在 org.glassfish.persistence.jpa .PersistenceUnitLoader(PersistenceUnitLoader.java:119) 在 org.glassfish.persistence.jpa.JPADeployer $ 1.visitPUD(JPADeployer.java:213) 在 org.glassfish.persistence.jpa.JPADeployer $ PersistenceUnitDescriptorIterator.iteratePUDs(JPADeployer .java:486) at org.glassfish.persistence.jpa.JPADeployer.createEMFs(JPADeployer.java:220) at org.glas sfish.persistence.jpa.JPADeployer.prepare(JPADeployer.java:166) 在 com.sun.enterprise.v3.server.ApplicationLifecycle.prepareModule(ApplicationLifecycle.java:870) 在 com.sun.enterprise.v3。 server.ApplicationLifecycle.deploy(ApplicationLifecycle。的java:410) 在 com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240) 在 org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:370) 在 com.sun.enterprise.v3.admin.CommandRunnerImpl $ 1.execute(CommandRunnerImpl.java:355) 在 com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370) 在 融爲一體。 sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1067) 在 com.sun.enterprise.v3.admin.CommandRunnerImpl.access $ 1200(CommandRunnerImpl.java:96) 在 com.sun.ent erprise.v3.admin.CommandRunnerImpl $ ExecutionContext.execute(CommandRunnerImpl.java:1247) 在 com.sun.enterprise.v3.admin.CommandRunnerImpl $ ExecutionContext.execute(CommandRunnerImpl.java:1235) 在 的com.sun。 enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:465) at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:222) at com.sun.grizzly.tcp。 http11.GrizzlyAdapter.service(GrizzlyAdapter.java:168) 在 com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117) 在 com.sun.enterprise.v3.services.impl。 ContainerMapper.service(ContainerMapper.java:234) 在 com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822) 在 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719) 在 com.sun.grizzly .http.ProcessorTask.process(ProcessorTask.java:1013) 在 com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225) 在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java :137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 在 com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 在 com.sun.grizzly.SelectionKeyContextTask .Call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71)at com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:532) 在 com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:513) 在java.lang.Thread.run(Thread.java:619)

嚴重:異常WHI文件準備應用

更新: 我再次閱讀文檔,注意這個信息的重要和平:

DISCRIMINATOR關聯到的分區(鑑別)的方法。 嘗試使用此策略打開沒有租戶 標識符的會話時出錯。該策略在4.0和4.1版本的Hibernate中尚未實現 。它的支持計劃爲5.0。

這是否意味着鑑別器策略目前不可用? 也許這是整個問題?

任何幫助將是偉大的。 謝謝, 伊多。

+1

我只能推測MultiTenantConnectionProviderJdbcConnectionAccess似乎是這個空可能是一個錯誤。如果是我,因爲這是非常流行的優勢,我試着聯繫Hibernate的IRC標籤irc.freenode.net/#hibernate中的一個人或者發佈hibernate社區論壇(https://forum.hibernate.org /) – nsfyn55

回答

0

您還沒有指定Hibernate應該如何獲得連接。您是否閱讀過與此相關的文檔? http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#d5e4583

而具體: http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#d5e4658 http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#d5e4702

+0

我沒有閱讀,我已經指定。我有jta-data-source元素。我已經看過http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html_single/#d5e4658 –

+0

現在我正在仔細觀察你的代碼片段中的兩個問題:(1)DISCRIMINATOR不是但支持。 (2)JPA還沒有真正支持多租戶; JPA支持的主要問題是需要能夠配合Session創建過程;已經通過解決了4.1.4。但即使在4.1.4中,您也無法傳入數據源;您將需要按照鏈接的文檔中的MultiTenantConnectionProvider說明進行操作。 –

+0

MultiTenantConnectionProvider意味着我必須爲每個租戶都有單獨的數據庫。這將很難維持,也不會擴展。 –