javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名

时间:2016-10-01 16:11:05

标签: java hibernate jndi

我正在尝试用Hibernate做一个简单的应用程序。我创建了hibernate.cfg.xml和映射文件Personne.hbm.xml。一旦我启动它,我得到一个异常javax.naming.NoInitialContextException:需要在环境或系统属性中指定类名...

详细说明: 我得到的错误是:

14 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.3.2.GA
16 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found
20 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
25 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
83 [main] INFO org.hibernate.cfg.Configuration - configuring from resource: /hibernate.cfg.xml
83 [main] INFO org.hibernate.cfg.Configuration - Configuration resource: /hibernate.cfg.xml
170 [main] INFO org.hibernate.cfg.Configuration - Reading mappings from resource : bean/Personne.hbm.xml
223 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: bean.Personne -> PERSONNES
238 [main] INFO org.hibernate.cfg.Configuration - Configured SessionFactory: java:hibernate/SessionFactory
292 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Using Hibernate built-in connection pool (not for production use!)
292 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Hibernate connection pool size: 1
292 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - autocommit mode: false
300 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost:3306/Gestion_BD_Personne
300 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - connection properties: {user=Gestion_user, password=****}
600 [main] INFO org.hibernate.cfg.SettingsFactory - RDBMS: MySQL, version: 5.1.32-community
600 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC driver: MySQL Connector Java, version: mysql-connector-java-5.1.39 ( Revision: 3289a357af6d09ecc1a10fd3c26e95183e5790ad )
618 [main] INFO org.hibernate.dialect.Dialect - Using dialect: org.hibernate.dialect.MySQLDialect
621 [main] INFO org.hibernate.transaction.TransactionFactoryFactory - Using default transaction strategy (direct JDBC transactions)
623 [main] INFO org.hibernate.transaction.TransactionManagerLookupFactory - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
623 [main] INFO org.hibernate.cfg.SettingsFactory - Automatic flush during beforeCompletion(): disabled
623 [main] INFO org.hibernate.cfg.SettingsFactory - Automatic session close at end of transaction: disabled
623 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC batch size: 15
623 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC batch updates for versioned data: disabled
624 [main] INFO org.hibernate.cfg.SettingsFactory - Scrollable result sets: enabled
624 [main] INFO org.hibernate.cfg.SettingsFactory - JDBC3 getGeneratedKeys(): enabled
624 [main] INFO org.hibernate.cfg.SettingsFactory - Connection release mode: auto
625 [main] INFO org.hibernate.cfg.SettingsFactory - Maximum outer join fetch depth: 2
625 [main] INFO org.hibernate.cfg.SettingsFactory - Default batch fetch size: 1
625 [main] INFO org.hibernate.cfg.SettingsFactory - Generate SQL with comments: disabled
625 [main] INFO org.hibernate.cfg.SettingsFactory - Order SQL updates by primary key: disabled
625 [main] INFO org.hibernate.cfg.SettingsFactory - Order SQL inserts for batching: disabled
625 [main] INFO org.hibernate.cfg.SettingsFactory - Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
627 [main] INFO org.hibernate.hql.ast.ASTQueryTranslatorFactory - Using ASTQueryTranslatorFactory
627 [main] INFO org.hibernate.cfg.SettingsFactory - Query language substitutions: {}
627 [main] INFO org.hibernate.cfg.SettingsFactory - JPA-QL strict compliance: disabled
627 [main] INFO org.hibernate.cfg.SettingsFactory - Second-level cache: enabled
627 [main] INFO org.hibernate.cfg.SettingsFactory - Query cache: disabled
629 [main] INFO org.hibernate.cfg.SettingsFactory - Cache region factory : org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge
630 [main] INFO org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge - Cache provider: org.hibernate.cache.NoCacheProvider
630 [main] INFO org.hibernate.cfg.SettingsFactory - Optimize cache for minimal puts: disabled
630 [main] INFO org.hibernate.cfg.SettingsFactory - Structured second-level cache entries: disabled
632 [main] INFO org.hibernate.cfg.SettingsFactory - Echoing all SQL to stdout
633 [main] INFO org.hibernate.cfg.SettingsFactory - Statistics: disabled
633 [main] INFO org.hibernate.cfg.SettingsFactory - Deleted entity synthetic identifier rollback: disabled
633 [main] INFO org.hibernate.cfg.SettingsFactory - Default entity-mode: pojo
633 [main] INFO org.hibernate.cfg.SettingsFactory - Named query checking : enabled
680 [main] INFO org.hibernate.impl.SessionFactoryImpl - building session factory
831 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Factory name: java:hibernate/SessionFactory
831 [main] INFO org.hibernate.util.NamingHelper - JNDI InitialContext properties:{}
833 [main] WARN org.hibernate.impl.SessionFactoryObjectFactory - Could not bind factory to JNDI
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
    at javax.naming.InitialContext.getNameParser(InitialContext.java:505)
    at org.hibernate.util.NamingHelper.bind(NamingHelper.java:75)
    at org.hibernate.impl.SessionFactoryObjectFactory.addInstance(SessionFactoryObjectFactory.java:113)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:348)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)
    at util.HibernateUtil.<clinit>(HibernateUtil.java:12)
    at manager.PersonneManager.ajouterPersonne(PersonneManager.java:12)
    at test.TestMain.main(TestMain.java:14)
840 [main] INFO org.hibernate.tool.hbm2ddl.SchemaExport - Running hbm2ddl schema export
840 [main] INFO org.hibernate.tool.hbm2ddl.SchemaExport - exporting generated schema to database
1564 [main] INFO org.hibernate.tool.hbm2ddl.SchemaExport - schema export complete
Hibernate: select max(id_personne) from PERSONNES
Hibernate: insert into PERSONNES (nom_personne, prenom_personne, tel_personne, email_personne, id_personne) values (?, ?, ?, ?, ?)
Hibernate: insert into PERSONNES (nom_personne, prenom_personne, tel_personne, email_personne, id_personne) values (?, ?, ?, ?, ?)
Hibernate: insert into PERSONNES (nom_personne, prenom_personne, tel_personne, email_personne, id_personne) values (?, ?, ?, ?, ?)
1683 [main] INFO org.hibernate.impl.SessionFactoryImpl - closing
1684 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - cleaning up connection pool: jdbc:mysql://localhost:3306/Gestion_BD_Personne
1685 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Unbinding factory from JNDI name: java:hibernate/SessionFactory
1685 [main] INFO org.hibernate.util.NamingHelper - JNDI InitialContext properties:{}
1685 [main] WARN org.hibernate.impl.SessionFactoryObjectFactory - Could not unbind factory from JNDI
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
    at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:662)
    at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313)
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:350)
    at javax.naming.InitialContext.unbind(InitialContext.java:441)
    at org.hibernate.impl.SessionFactoryObjectFactory.removeInstance(SessionFactoryObjectFactory.java:139)
    at org.hibernate.impl.SessionFactoryImpl.close(SessionFactoryImpl.java:894)
    at test.TestMain.main(TestMain.java:18)

的hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <!-- a SessionFactory instance listed as /jndi/name -->
    <session-factory
        name="java:hibernate/SessionFactory">

        <!-- properties -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/Gestion_BD_Personne</property>
        <property name="connection.username">Gestion_user</property>
        <property name="connection.password">user</property>

        <property name="connection.pool_size">1</property>

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <property name="current_session_context_class">thread</property>

        <property name="cache.provider_class">hibernate.cache.NoCacheProvider</property>

        <property name="show_sql">true</property>

        <property name="hbm2ddl.auto">create</property>

        <!-- mapping files -->
        <mapping resource="bean/Personne.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

Personne.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping> 

    <class name="bean.Personne" table="PERSONNES"> 
        <id name="id" column="id_personne" > 
            <generator class="increment" /> 
        </id> 

        <property name="nom" column="nom_personne" />
        <property name="prenom" column="prenom_personne" />
        <property name="tel" column="tel_personne" />
        <property name="email" column="email_personne" />
    </class> 

</hibernate-mapping>

HibernateUtil.java

package util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

    public static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new Configuration().configure().buildSessionFactory();

        } catch (Throwable ex) {
            System.out.println("Creation du sessionFactory a échoué"+ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;

    }




}

TestMain.java

package test;

import manager.PersonneManager;
import util.HibernateUtil;

public class TestMain {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    PersonneManager personneManager = new PersonneManager();
    personneManager.ajouterPersonne("nom1", "prenom1", "tel1", "email1");
    personneManager.ajouterPersonne("nom2", "prenom2", "tel2", "email2");
    personneManager.ajouterPersonne("nom3", "prenom3", "tel3", "email3");

    HibernateUtil.sessionFactory.close();

    }

}

1 个答案:

答案 0 :(得分:1)

既然你说你刚刚开始学习Hibernate,我认为你并没有故意试图创建一个JNDI绑定的SessionFactory:

<session-factory
        name="java:hibernate/SessionFactory">

我可以看到这是Hibernate官方文档的副本。在那里,作者解释说,通过这个命名,您将把SessionFactory绑定到JNDI上下文。这正是对你不起作用的,因为你还没有配置。最简单的解决方案实际上就是删除name参数并停止尝试进行绑定。