无法将 Hibernate 会话工厂绑定到 WildFly 8.2.1 中的 java:app



我正试图从部署到WildFly 8.2.1的应用程序中的持久性单元注册Hibernate会话工厂,并且我遇到了Hibernate 4代码(如下所列)的警告异常。当我在WildFly控制台中查看JNDI时,会话工厂肯定没有注册。我希望他们是在"java:app"作用域,这样我就可以避免命名冲突,当多个应用程序可能有相同的会话工厂名称。

将实体管理器注册到这个作用域可以正常工作。

如果我把"java:app"前缀从会话工厂名称中去掉,它就会很好地绑定到JNDI中,但在全局范围内。我知道我可以施加某种名称间隔,但我希望我不必这样做。

任何输入将是感激的。谢谢你!

低于…细节

持久化单元

<persistence-unit name="myPU" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:/jdbc/MyDS</jta-data-source>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<mapping-file>MySchema.hbm.xml</mapping-file>
<properties>
<property name="jboss.entity.manager.jndi.name" value="java:app/em/MY_EM" />
<property name="hibernate.session_factory_name" value="java:app/sessions/my_FACTORY"/>
<property name="hibernate.query.imports" value="com.my.model" />
<property name="hibernate.current_session_context_class" value="thread" />
<property name="hibernate.use_outer_join" value="true" />
<property name="hibernate.jdbc.use_streams_for_binary" value="true" />
<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect" />
</properties>
</persistence-unit>
<<p>异常片段/strong>

16:14:50,044 WARN [org.hibernate.internal.SessionFactoryRegistry] (ServerService线程池—64)- HHH000277:无法将工厂绑定到JNDI: org.hibernate.engine.jndi.JndiException: Error creating intermediate context [java:app]

原因:javax.naming.NameNotFoundException: java:app

Hibernate的完整警告异常

16:14:50,044 WARN [org.hibernate.internal.SessionFactoryRegistry] (ServerService线程池—64)- HHH000277:无法将工厂绑定到JNDI: org.hibernate.engine.jndi.JndiException:创建中间上下文错误[java:app][hibernate-core-4.3.7.Final.jar:4.3.7.Final][hibernate-core-4.3.7.Final.jar:4.3.7.Final][hibernate-core-4.3.7.Final.jar:4.3.7.Final](SessionFactoryImpl.java:497) [hibernate-core-4.3.7.Final.jar:4.3.7.Final][hibernate-core-4.3.7.Final.jar:4.3.7.Final][hibernate- EntityManagerFactoryBuilderImpl.java:852][hibernate- EntityManagerFactoryBuilderImpl.java:845][hibernate-core-4.3.7.Final.jar:4.3.7.Final][hibernate- EntityManagerFactoryBuilderImpl.java:844][jipijapa-hibernate4-3-1.0.1.Final.jar]$1.run(PersistenceUnitServiceImpl.java:154) [wildfly-jpa-8.2.1.Final.jar:8.2.1.Final]$1$1.run(PersistenceUnitServiceImpl.java:117) [wildfly-jpa-8.2.1.Final.jar:8.2.1.Final]在java.security.AccessController。doPrivileged(Native Method) [rt.jar:1.8.0_51][wildfly-security-manager-1.0.0. jar:1.0.0.Final].jboss.as.jpa.service. persistenceunitserviceimpl $1.run(PersistenceUnitServiceImpl.java:182)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_51]$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_51]at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_51]org.jboss.threads.JBossThread.run (JBossThread.java: 122)原因:javax.naming.NameNotFoundException: java:app$DefaultInitialContext.findContext(InitialContext.java:187)$DefaultInitialContext.createSubcontext(InitialContext.java:294)[wildfly- nam-8.2.1.final .jar:8.2.1.Final]at javax.naming.InitialContext.createSubcontext(InitialContext.java:489) [rt.jar:1.8.0_51]at javax.naming.InitialContext.createSubcontext(InitialContext.java:489) [rt.jar:1.8.0_51][hibernate-core-4.3.7.Final.jar:4.3.7.Final]…18更多

我可能已经找到答案了…

虽然这不是我想要的答案。但是,这是有道理的。Hibernate的JNDI绑定机器人无法找到java:app子上下文的原因是,我认为,它试图在根目录中找到这个名称,而它在根目录中不存在。另一方面,JBoss/WildFly在部署应用程序时似乎有一些隐含的上下文,实际上作为JNDI树中applications/<module-name>下存在的java:app。Hibernate对这个结构一无所知。

我修改了我的实现,在JNDI树的根按应用程序名称组织这些会话工厂绑定,如下所示:

hib > myApp > sessions > MY_SESSION_FACTORY

我希望这能帮助到别人。

最新更新