Can';t将Hibernate会话工厂绑定到WildFly 8.2.1中的java:app中

Can';t将Hibernate会话工厂绑定到WildFly 8.2.1中的java:app中,java,hibernate,jpa,jndi,wildfly,Java,Hibernate,Jpa,Jndi,Wildfly,我试图从部署到WildFly 8.2.1的应用程序中的持久化单元注册Hibernate会话工厂,但遇到Hibernate 4代码(如下所列)的警告异常。当我在WildFly控制台中查看JNDI时,会话工厂肯定没有注册。我希望它们位于“java:app”范围内,这样当多个应用程序可能具有相同的会话工厂名称时,我就可以避免命名冲突 将实体管理器注册到此范围可以正常工作 如果我将“java:app”前缀从会话工厂名称中去掉,它将很好地绑定到JNDI中,但是是在全局范围内。我知道我可以设置一些名称间隔,

我试图从部署到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>

org.hibernate.jpa.HibernatePersistenceProvider
java:/jdbc/MyDS
真的
MySchema.hbm.xml
异常片段

<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>
16:14:50044警告[org.hibernate.internal.SessionFactoryRegistry](ServerService线程池--64)-HH000277:无法将工厂绑定到JNDI:org.hibernate.engine.JNDI.JndiException:创建中间上下文[java:app]时出错

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

来自Hibernate的完全警告异常

16:14:50044警告[org.hibernate.internal.SessionFactoryRegistry](ServerService线程池--64)-HH000277:无法将工厂绑定到JNDI:org.hibernate.engine.JNDI.JndiException:创建中间上下文[java:app]时出错 位于org.hibernate.engine.jndi.internal.JndiServiceImpl.bind(JndiServiceImpl.java:205)[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 位于org.hibernate.engine.jndi.internal.JndiServiceImpl.bind(JndiServiceImpl.java:159)[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 在org.hibernate.internal.SessionFactoryRegistry.addSessionFactory(SessionFactoryRegistry.java:103)[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 位于org.hibernate.internal.sessionfactorympl.(sessionfactorympl.java:497)[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 在org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859)[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 在org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852)[hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final] 在org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845)[hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final] 位于org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)[hibernate-core-4.3.7.Final.jar:4.3.7.Final] 在org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844)[hibernate-entitymanager-4.3.7.Final.jar:4.3.7.Final] 在org.jboss.as.jpa.hibernate4.TwoPhaseBootstrapImpl.build(TwoPhaseBootstrapImpl.java:44)[jipijapa-hibernate4-3-1.0.1.Final.jar:] 在org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:154)[wildfly-jpa-8.2.1.Final.jar:8.2.1.Final] 在org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:117)[wildfly-jpa-8.2.1.Final.jar:8.2.1.Final] 位于java.security.AccessController.doPrivileged(本机方法)[rt.jar:1.8.0_51] 在org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:474)[wildfly-security-manager-1.0.0.Final.jar:1.0.0.Final] 在org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.run(PersistenceUnitServiceImpl.java:182)[wildfly-jpa-8.2.1.Final.jar:8.2.1.Final] 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[rt.jar:1.8.051] 在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[rt.jar:1.8.051] 在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 在org.jboss.as.naming.InitialContext$DefaultInitialContext.findContext(InitialContext.java:187)[wildfly-naming-8.2.1.Final.jar:8.2.1.Final] 在org.jboss.as.naming.InitialContext$DefaultInitialContext.createSubcontext(InitialContext.java:294)[wildfly-naming-8.2.1.Final.jar:8.2.1.Final] 在org.jboss.as.naming.NamingContext.createSubcontext(NamingContext.java:398)[wildfly-naming-8.2.1.Final.jar:8.2.1.Final] 在javax.naming.InitialContext.createSubcontext(InitialContext.java:489)[rt.jar:1.8.0_51] 在javax.naming.InitialContext.createSubcontext(InitialContext.java:489)[rt.jar:1.8.0_51] 位于org.hibernate.engine.jndi.internal.JndiServiceImpl.bind(JndiServiceImpl.java:202)[hibernate-core-4.3.7.Final.jar:4.3.7.Final] ... 还有18个


我可能已经找到了答案

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

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