I know this question has been asked a lot, but I read almost every one of them but non of them helped me. I'm writing an eclipse maven project with hibernate and I'm getting this error:
org.hibernate.InvalidMappingException: Could not parse mapping document from resource ir/ac/ut/ieproj/da/Student.hbm.xml
my files are like this:
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ir.ac.ut</groupId>
<artifactId>ieproj</artifactId>
<version>0.2</version>
<packaging>war</packaging>
<name>ieproj</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0</version>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>JBoss repository</id>
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ir.ac.ut</groupId>
<artifactId>iecommon</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.24</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>3.5.1-Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.5.1-Final</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.4</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.5.4-Final</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.4</version>
</dependency>
</dependencies>
</project>
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>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/db</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">13812002</property>
<property name="hibernate.connection.pool_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Mapping files -->
<mapping resource="ir/ac/ut/ieproj/da/Department.hbm.xml"/>
<mapping resource="ir/ac/ut/ieproj/da/Studyrec.hbm.xml"/>
<mapping resource="ir/ac/ut/ieproj/da/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Department.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="ir.ac.ut.ieproj.da">
<class name="DepartmentRepo" table="department">
<id name="id" type="int" column="ID" >
<generator class="assigned"/>
</id>
<property name="name" column="Name" type="string"/>
</class>
<sql-query name="getDeptName">
<return alias="Department" class="DepartmentRepo"/>
<![CDATA[select * from db.department d where d.ID = :id]]>
</sql-query>
</hibernate-mapping>
Student.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="ir.ac.ut.ieproj.da">
<class name="StudentRepo" table="student">
<id name="id" type="int" column="ID" >
<generator class="assigned"/>
</id>
<property name="firstName" type="string" column="FirstName" />
</property>
<property name="lastName" type="string" column="LastName"/>
</property>
<property name="program" type="string" column="Program"/>
</property>
<many-to-one
name="dept"
class="DepartmentRepo"
cascade="all"
not-null="true"
column="deptId"/>
</class>
<sql-query name="findStudentId">
<return alias="Student" class="StudentRepo"/>
<![CDATA[select * from db.student s where s.ID = :sid]]>
</sql-query>
</hibernate-mapping>
StudentRepo.java
package ir.ac.ut.ieproj.da;
import ir.ac.ut.ieproj.model.Student;
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class StudentRepo {
private int id;
private String firstName;
private String lastName;
private String program;
private DepartmentRepo dept;
public Student getStudentbyId (String sid) throws MappingException, HibernateException, Exception {
Student student = new Student();
Session session = HibernateUtil.getHibernateSession();
Transaction tx = session.beginTransaction();
Query query = session.getNamedQuery("findStudentId").setLong("sid", Long.valueOf(sid));
StudentRepo studentRepo = (StudentRepo) query.uniqueResult();
student.setId(studentRepo.getId());
student.setFirstName(studentRepo.getFirstName());
student.setLastName(studentRepo.getLastName());
student.setProgram(Integer.valueOf(studentRepo.getProgram()));
tx.commit();
session.close();
return student;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getProgram() {
return program;
}
public void setProgram(String program) {
this.program = program;
}
public DepartmentRepo getDept() {
return dept;
}
public void setDept(DepartmentRepo dept) {
this.dept = dept;
}
}
DepartmentRepo.java
package ir.ac.ut.ieproj.da;
import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ir.ac.ut.ieproj.model.Department;
public class DepartmentRepo {
private int id;
private String name;
public Department getDeptbyId(String id) throws MappingException, HibernateException, Exception {
Session session = HibernateUtil.getHibernateSession();
Transaction tx = session.beginTransaction();
Query query = session.getNamedQuery("getDeptName").setLong("id", Integer.valueOf(id));
DepartmentRepo departmentRepo = (DepartmentRepo) query.uniqueResult();
Department department = new Department();
department.setName(departmentRepo.getName());
tx.commit();
session.close();
return department;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
I think the problem is with the many-to-one tag in Student.hbm.xml because Department.hbm.xml and the namedQuery within are not causing an error. What am I doing wrong? I'm using mvn package to make a .war file and then deploy it in tomcat 7.
The error
Could not parse mapping document
is about your xml files not being well-formed. When this error comes up, we'd better double check our xml files to see if they are really OK (all tags are properly closed and so on).In your case, as the message states, your
Student.hbm.xml
file is the problem. You have some tags that do not belong:Those closing
</property>
tags aren't closing no one, as the<property
tags above them are self-closed (notice the/>
).Try to change hibernate mapping DTD. My problem solves after changing http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd to http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
In my case was just a comment at the beggining of xml. If someone have a comment like just remove it and maybe will work.
My problem solves after changing http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd to http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd. The issue could caused by timeout when access to remote DTD file.
I would download the hibernate-mapping-3.0.dtd and make it available locally.
May Be This problem because of Not matching with The variable names used in bean class.
For eg. Then Your variable names should be FirstName.
you might have configured multiple times of mapping tag for same entity/persistence.