2016-11-26 15 views
5

Tôi có một lỗi lạ xuất hiện mỗi lần tôi muốn triển khai ứng dụng của mình. Tôi đang sử dụng IntelliJ IDEA 2016.3.Không thể xây dựng ngoại lệ Hibernate SessionFactory từ hư không

Ứng dụng của tôi là ứng dụng Java WEB sử dụng JSF, EJB và JPA (Hibernate). Tất cả các libs được tải xuống bởi IDEA (không có Maven trong dự án này), tất cả các phụ thuộc đều được gửi kèm với tệp .war. Tôi đang triển khai để TomEE 7.0.2 trên Windows 10

Dưới đây là tác phẩm của tôi cấu hình có liên quan trong việc triển khai: 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> 

Và stacktrace của tôi:

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 

Đây chỉ là một phần nhỏ đề cập đến ngoại lệ. Dưới đây là full stacktrace & server logs

Tất cả nội dung cơ sở dữ liệu và ánh xạ JPA đều OK. Kiểm tra kỹ lưỡng và tinh chế để hoàn thiện. Trong thực tế, tôi đã có thể chạy ứng dụng của tôi trên máy chủ Tomcat 8.5.6, nhưng nó không hỗ trợ EJB, vì vậy tôi cần TomEE.

Xâm phạm gốc ở đây là java.lang.IllegalStateException: On a thread without an initialized context nor a classloader mapping a deployed app. Nó xuất hiện trong tất cả các dự án Hibernate-JPA của tôi (ngay cả các bài kiểm tra đơn giản chỉ với một thực thể và không có không gian để báo lỗi), vì vậy tôi tin rằng đây là loại vấn đề cấu hình phía máy chủ thực sự.

Tuy nhiên tôi không thể tìm thấy bất kỳ đầu mối nào về ngoại lệ này, không phải trên StackOverflow cũng như trên internet.

Tôi rất mong nhận được sự giúp đỡ của bạn, rất vui khi nhận được bất kỳ trợ giúp và lời khuyên nào.

+2

Cảm ơn câu hỏi - Tôi gặp vấn đề tương tự ở đây bằng cách nâng cấp từ TomEE 7.0.1 sang TomEE 7.0.2, Hibernate 5.2.4 – rzo

Trả lời

7

bạn có thể thêm vào persistence.xml bạn

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

hoặc

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

nếu bạn không cần CDI/JPA hội nhập

chỉnh sửa: thứ nhất một sẽ làm cho các nhà máy tạo vào lần đầu tiên sử dụng lúc chạy và thứ hai chỉ cần tắt cdi. Cả hai công việc gây ra bạn không cần CDI khi JPA được khởi tạo trong khi khởi động (tomee tạo ra nhà máy trước khi bắt đầu cdi gây ra cdi có thể dựa vào nó - vấn đề trứng gà)

+1

Bạn có thể vui lòng chỉnh sửa câu trả lời của mình và giải thích chi tiết hơn về sự khác biệt giữa hai thuộc tính và/hoặc cung cấp liên kết đến tài liệu chính thức của dự án Apache TomEE không? Thx trước. – MWiesner

+2

'tomee.jpa.factory.lazy' hoạt động cho tôi. Và tôi không thích openejb/openjpa. –

Các vấn đề liên quan