2016-11-26 71 views
5

我每次想要部署我的應用程序時都會出現一個奇怪的錯誤。 我正在使用IntelliJ IDEA 2016.3。無法構建Hibernate SessionFactory異常

我的應用程序是使用JSF,EJB和JPA(Hibernate)的Java WEB應用程序。所有的庫都是由IDEA下載的(在這個項目中沒有Maven),所有依賴項都附帶.war文件。我在Windows 10部署到TomEE 7.0.2

以下是參與我的部署配置文件:resources.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<resources> 
    <Resource id="my_internet_shop_db" type="javax.sql.DataSource"> 
     JdbcDriver com.mysql.jdbc.Driver 
     JdbcUrl jdbc:mysql://localhost:3306/my_internet_shop?autoReconnect=true&amp;useSSL=true 
     UserName root 
     Password alpine 
     validationQuery = SELECT 1 
     JtaManaged true 
    </Resource> 
</resources> 

的persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> 

    <persistence-unit name="my_internet_shop" transaction-type="JTA"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <jta-data-source>my_internet_shop_db</jta-data-source> 
     <class>Objects.Order.CartEntity</class> 
     <class>Objects.User.ContactEntity</class> 
     <class>Objects.Order.OrderEntity</class> 
     <class>Objects.Product.ProductEntity</class> 
     <class>Objects.Section.SectionEntity</class> 
     <class>Objects.Service.ServiceEntity</class> 
     <class>Objects.User.UserEntity</class> 
     <properties> 
      <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/my_internet_shop"/> 
      <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/> 
      <property name="hibernate.connection.username" value="root"/> 
      <property name="hibernate.connection.password" value="alpine"/> 
      <property name="hibernate.archive.autodetection" value="class"/> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="true"/> 
      <property name="hbm2ddl.auto" value="update"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

我的堆棧跟蹤:

org.apache.openejb.OpenEJBException: org.apache.openejb.OpenEJBRuntimeException: javax.persistence.PersistenceException: [PersistenceUnit: my_internet_shop] Unable to build Hibernate SessionFactory: javax.persistence.PersistenceException: [PersistenceUnit: my_internet_shop] Unable to build Hibernate SessionFactory 
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:872) 
    ... 65 more 
Caused by: org.apache.openejb.OpenEJBRuntimeException: javax.persistence.PersistenceException: [PersistenceUnit: my_internet_shop] Unable to build Hibernate SessionFactory 
    at org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory.createDelegate(ReloadableEntityManagerFactory.java:136) 
    at org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory.<init>(ReloadableEntityManagerFactory.java:105) 
    at org.apache.openejb.assembler.classic.PersistenceBuilder.createEntityManagerFactory(PersistenceBuilder.java:157) 
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:866) 
    ... 65 more 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: my_internet_shop] Unable to build Hibernate SessionFactory 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:951) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:881) 
    at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:151) 
    at org.apache.openejb.assembler.classic.EntityManagerFactoryCallable.call(EntityManagerFactoryCallable.java:122) 
    at org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory.createDelegate(ReloadableEntityManagerFactory.java:134) 
    ... 68 more 
Caused by: org.hibernate.HibernateException: Could not access BeanManager ListenerFactory class [org.hibernate.jpa.event.internal.jpa.ListenerFactoryBeanManagerStandardImpl] to handle CDI extensions 
    at org.hibernate.jpa.event.spi.jpa.ListenerFactoryBuilder.buildBeanManagerListenerFactory(ListenerFactoryBuilder.java:96) 
    at org.hibernate.jpa.event.spi.jpa.ListenerFactoryBuilder.buildStandardBeanManagerListenerFactory(ListenerFactoryBuilder.java:59) 
    at org.hibernate.jpa.event.spi.jpa.ListenerFactoryBuilder.buildListenerFactory(ListenerFactoryBuilder.java:42) 
    at org.hibernate.jpa.event.spi.JpaIntegrator.integrate(JpaIntegrator.java:135) 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:278) 
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:493) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:878) 
    ... 71 more 
Caused by: java.lang.IllegalStateException: On a thread without an initialized context nor a classloader mapping a deployed app 
    at org.apache.openejb.cdi.ThreadSingletonServiceImpl.get(ThreadSingletonServiceImpl.java:287) 
    at org.apache.openejb.cdi.ThreadSingletonServiceImpl.getContext(ThreadSingletonServiceImpl.java:263) 
    at org.apache.openejb.cdi.ThreadSingletonServiceImpl.get(ThreadSingletonServiceImpl.java:298) 
    at org.apache.openejb.cdi.ThreadSingletonServiceImpl.get(ThreadSingletonServiceImpl.java:60) 
    at org.apache.webbeans.config.WebBeansFinder.getSingletonInstance(WebBeansFinder.java:51) 
    at org.apache.webbeans.config.WebBeansContext.getInstance(WebBeansContext.java:185) 
    at org.apache.webbeans.config.WebBeansContext.currentInstance(WebBeansContext.java:203) 
    at org.apache.openejb.assembler.classic.EntityManagerFactoryCallable$1.findBm(EntityManagerFactoryCallable.java:105) 
    at org.apache.openejb.assembler.classic.EntityManagerFactoryCallable$1.invoke(EntityManagerFactoryCallable.java:96) 
    at com.sun.proxy.$Proxy70.toString(Unknown Source) 
    at java.lang.String.valueOf(String.java:2994) 
    at java.lang.StringBuilder.append(StringBuilder.java:131) 
    at org.hibernate.jpa.event.internal.jpa.ListenerFactoryBeanManagerStandardImpl.<init>(ListenerFactoryBeanManagerStandardImpl.java:60) 
    at org.hibernate.jpa.event.internal.jpa.ListenerFactoryBeanManagerStandardImpl.fromBeanManagerReference(ListenerFactoryBeanManagerStandardImpl.java:55) 
    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:498) 
    at org.hibernate.jpa.event.spi.jpa.ListenerFactoryBuilder.buildBeanManagerListenerFactory(ListenerFactoryBuilder.java:80) 
    ... 77 more 

這只是一小部分提到的例外。這裏是full stacktrace & server logs

所有的數據庫的東西和JPA映射都可以。仔細檢查並完善至完美。事實上,我能夠在Tomcat 8.5.6服務器上運行我的應用程序,但它不支持EJB,所以我需要TomEE。

這裏的根音是java.lang.IllegalStateException: On a thread without an initialized context nor a classloader mapping a deployed app。它出現在我所有的Hibernate-JPA項目中(即使是隻有一個實體的簡單測試,沒有出錯的空間),所以我認爲這是真正的服務器端配置類型的問題。

但是我無法在StackOverflow和互聯網上找到關於此異常的任何線索。

我期待着您的幫助,很樂意爲您提供幫助和建議。

+2

感謝您的問題 - 我在這裏遇到同樣的問題,從TomEE 7.0.1到TomEE 7.0.2,Hibernate 5.2.4 – rzo

回答

7

你可以在你的persistence.xml添加

<property name="tomee.jpa.factory.lazy" value="true" /> 

<property name="tomee.jpa.cdi" value="false" /> 

如果你不需要CDI/JPA集成

編輯:第一次將使工廠創建在運行時第一次使用,第二個只是禁用cdi。當啓動期間JPA被初始化時,這兩種工作都會導致你不需要CDI(tomee在啓動cdi之前創建工廠原因cdi可以依靠它 - 雞蛋問題)

+1

您能否編輯您的答案並更詳細地解釋這兩個屬性之間的區別是否和/或提供了由Apache TomEE項目提供的官方文檔鏈接? Thx提前。 – MWiesner

+2

'tomee.jpa.factory.lazy'適合我。我不喜歡openejb/openjpa。 –

相關問題