2011-06-09 100 views
23

有人能告诉我为什么我会收到以下错误?Hibernate:javax.naming.NoInitialContextException(组件映射通过注释)

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(Unknown Source) 
    at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source) 
    at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source) 
    at javax.naming.InitialContext.getNameParser(Unknown Source) 
    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 org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) 
    at com.transbinary.main.Client.main(Client.java:13) 

我得到了想要的结果,并得到表填入数据,但我得到这个错误。

下面是我使用的代码: Person.java

@Entity 
public class Person implements Serializable { 
    private Integer id; 
    private Address homeAddress; 

    @Id 
    @GeneratedValue 
    public Integer getId() { 
     return id; 
    } 
    public void setId(Integer id) { 
     this.id = id; 
    } 

    public Address getHomeAddress() { 
     return homeAddress; 
    } 
    public void setHomeAddress(Address homeAddress) { 
     this.homeAddress = homeAddress; 
    } 
} 

Address.java

@Embeddable 
public class Address implements Serializable { 
    private String city; 
    private String Country; 

    public Address() {} 
    public Address(String city, String country) { 
     super(); 
     this.city = city; 
     Country = country; 
    } 

    public String getCity() { 
     return city; 
    } 
    public void setCity(String city) { 
     this.city = city; 
    } 
    public String getCountry() { 
     return Country; 
    } 
    public void setCountry(String country) { 
     Country = country; 
    } 
} 

的hibernate.cfg.xml

<hibernate-configuration> 
<session-factory name=""> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.password">password</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydb</property> 
    <property name="hibernate.connection.username">root</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 

    <property name="hibernate.hbm2ddl.auto">create</property> 
    <property name="hibernate.show_sql">true</property> 
    <property name="hibernate.format_sql">true</property> 

    <mapping class="com.transbinary.domain.Person"/> 

</session-factory> 
</hibernate-configuration> 

Client.java

public class Client { 
    public static void main(String[] args) {   
     SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); 
     Session session = sessionFactory.openSession(); 
     Transaction txn = session.beginTransaction(); 

     Person person = new Person(); 
     Address homeAddress = new Address("Mumbai", "India"); 
     person.setHomeAddress(homeAddress); 

     session.save(person); 

     txn.commit(); 
     session.close();    
    } 
} 

有人能帮助我了解为什么我收到这个错误?

谢谢。

回答

33

我想这是因为你在<session-factory>中指定了name属性,因此Hibernate试图在该名称下将SessionFactory绑定到JNDI,但是JNDI在您的环境中不可用。所以,删除name属性。

6

只需卸下name属性,即使它从你的会话工厂的映射空[hibernate.cfc.xml]