2016-11-26 2 views
5

У меня странная ошибка, возникающая каждый раз, когда я хочу развернуть мое приложение. Я использую IntelliJ IDEA 2016.3.Невозможно построить исключение SessionFactory Hibernate из ниоткуда

Мое приложение Java WEB-приложение использует JSF, EJB и JPA (Hibernate). Все библиотеки были загружены IDEA (без Maven в этом проекте), все зависимости поставляются с .war-файлом. Я развертыванием TomEE 7.0.2 на Windows, 10.

Вот мои конфигурационные файлы, участвующие в развертывании: 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> 

И мой StackTrace:

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. Обе работы заставляют вас не нуждаться в CDI, когда JPA инициализируется во время запуска (tomee создает фабрику перед запуском cdi, потому что cdi может полагаться на нее - проблема с куриным яйцом)

+1

Можете ли вы, пожалуйста, отредактировать свой ответ и более подробно объяснить, какая разница между обоими свойствами и/или предоставить ссылку на официальную документацию по проекту Apache TomEE? Thx заранее. – MWiesner

+2

'tomee.jpa.factory.lazy' работает для меня. И мне не нравится openejb/openjpa. –

Смежные вопросы