【问题标题】:Unable to build Hibernate SessionFactory exception from nowhere无法从任何地方构建 Hibernate SessionFactory 异常
【发布时间】:2025-12-26 00:35:12
【问题描述】:

每次我想部署我的应用程序时都会出现一个奇怪的错误。 我正在使用 IntelliJ IDEA 2016.3。

我的应用程序是使用 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。

这里的root excpetion 是java.lang.IllegalStateException: On a thread without an initialized context nor a classloader mapping a deployed app。它出现在我所有的 Hibernate-JPA 项目中(即使是只有一个实体且没有错误空间的简单测试),所以我相信这是真正的服务器端配置问题。

但是,我在 * 和互联网上都找不到有关此异常的任何线索。

我期待您的帮助,很高兴获得任何帮助和建议。

【问题讨论】:

  • 感谢您的提问 - 我从 TomEE 7.0.1 升级到 TomEE 7.0.2、Hibernate 5.2.4 时遇到了同样的问题

标签: java hibernate jpa exception


【解决方案1】:

你可以添加你的 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 可以依赖它 - 鸡蛋问题)

【讨论】:

  • 您能否编辑您的答案并更详细地解释这两个属性之间的区别和/或提供 Apache TomEE 项目的官方文档链接?提前谢谢。
  • tomee.jpa.factory.lazy 为我工作。而且我不喜欢 openejb/openjpa。