【问题标题】:JndiException when using Hibernate 4.0 with Tomcat 7 and JSF 2.0将 Hibernate 4.0 与 Tomcat 7 和 JSF 2.0 一起使用时出现 JndiException
【发布时间】:2013-03-14 13:50:23
【问题描述】:

在应用程序部署后,当方法执行时,我得到以下错误。

Caused by: org.hibernate.service.jndi.JndiException: Unable to lookup JNDI name [java:comp/env/JSF_HIBER/ORACLE]
    at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:68)
    at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.configure(DatasourceConnectionProviderImpl.java:116)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:223)
    at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:89)
    at org.hibernate.service.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:75)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:159)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:131)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:77)
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2283)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2279)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1748)
    at com.utils.HibernateUtils.<clinit>(HibernateUtils.java:19)
    ... 33 more
Caused by: javax.naming.NamingException: This context must be accessed through a java: URL
    at org.apache.naming.SelectorContext.parseName(SelectorContext.java:776)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:135)
    at javax.naming.InitialContext.lookup(Unknown Source)
    at org.hibernate.service.jndi.internal.JndiServiceImpl.locate(JndiServiceImpl.java:65)
    ... 47 more

Context.xml

<Resource name="JSF_HIBER/ORACLE" auth="Container"
    type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000"
    username="****" password="**** driverClassName="oracle.jdbc.OracleDriver"
    url="jdbc:oracle:thin:@99.99.999.999:1521:xe" />

hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.datasource">java:comp/env/JSF_HIBER/ORACLE</property>
        <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
        <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <property name="hibernate.connection.pool_size">10</property>
        <property name="show_sql">true</property>
        <property name="hibernate.current_session_context_class">thread</property>
    <mapping class="com.entity.User"/>
    </session-factory>
</hibernate-configuration>

Web.xml

<resource-ref>
        <description>JSF_HIBER</description>
        <res-ref-name>JSF_HIBER/ORACLE</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

我不知道为什么会出现这个错误,请帮助我...

【问题讨论】:

  • 你在说哪个context.xmlMETA-INF中的全局一或一?

标签: java hibernate tomcat


【解决方案1】:

您必须在 hibernate.cfg.xml 文件中的“java:”和“comp”之间添加一个斜杠:

&lt;property name="hibernate.connection.datasource"&gt;java:/comp/env/JSF_HIBER/ORACLE&lt;/property&gt;

应该可以解决问题

【讨论】:

  • 干得好!你是一个绅士和一个学者。这为我解决了这个问题。奇怪的是,当您不使用 Hibernate 获取 javax.sql.DataSource 时,旧字符串仍然有效。
  • @Jimit Tank 为什么不接受这个答案?它解决了你的问题吗,它解决了我的问题。
【解决方案2】:

您可能需要 META-INF/context.xml 中的以下内容将您的全局 JNDI 资源链接到特定于应用程序的资源:

<Context>
  <ResourceLink name="JSF_HIBER/ORACLE"
            global="JSF_HIBER/ORACLE"
            type="javax.sql.DataSource"
</Context>

它将您的全局数据源 JSF_HIBER/ORACLE 链接到您的本地数据源 java:comp/env/JSF_HIBER/ORACLE

编辑:

如果您不想创建应用级链接,可以改用全局 url:

<property name="hibernate.connection.datasource">JSF_HIBER/ORACLE</property>

【讨论】:

  • 我认为问题出在我的休眠代码中.. 请检查它是否正确.. 尝试 { Configuration conf = new Configuration(); conf.configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(conf.getProperties()).buildServiceRegistry(); SESSION_FACTORY = conf.buildSessionFactory(serviceRegistry); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); }
  • 我确实说过将代码添加到您的 META-INF/context.xml 而不是 server.xml。错误消息指向未完全正确设置的 JNDI 查找。
  • 我理解在 META-INF/ 中创建新的应用程序级别 context.xml 是吗?
  • 当我使用globel url... JSF_HIBER/ORACLE 然后我得到以下异常:: 由: javax.naming 引起。 NameNotFoundException:名称 JSF_HIBER 未绑定在 org.apache.naming.NamingContext.lookup(NamingContext.java:803) 处的 org.apache.naming.NamingContext.lookup(NamingContext.java:145) 处的此上下文中 org.apache.naming .SelectorContext.lookup(SelectorContext.java:135)
  • 我也尝试其他方式..在 META-INF/ 中创建一个新的 tomcate.xml,但它不起作用..
猜你喜欢
  • 2012-06-03
  • 2011-07-14
  • 2015-02-22
  • 2012-08-22
  • 2011-05-04
  • 2011-12-20
  • 2018-08-07
  • 2014-04-06
  • 1970-01-01
相关资源
最近更新 更多