Hibernate: javax.naming.NoInitialContextException (Component Mapping via Annotations)
Could someone tell me why am I getting the following error?
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:8开发者_JAVA百科67)
at com.transbinary.main.Client.main(Client.java:13)
I am getting the desired result and getting the person table populated with the data but I am getting this error.
Here is the code for I am using: 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();
}
}
Could someone help me understand why am I getting that error?
Thanks.
I guess it's caused by the fact that you specified name
attribute in <session-factory>
, therefore Hibernate tries to bind SessionFactory
to JNDI under that name, but JNDI is not available in your environment. So, remove name
attribute.
Just remove the name attribute even if its empty from your session-factory mapping [hibernate.cfc.xml]
To fix your error, you must delete the name attribute in the SessionFactory node.
精彩评论