org.hibernate.InvalidMappingException: Could not parse mapping document from resource *.hbm.xml

Raein Hashemi picture Raein Hashemi · May 19, 2013 · Viewed 38.9k times · Source

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.

Answer

acdcjunior picture acdcjunior · May 19, 2013

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:

<property name="firstName" type="string" column="FirstName" />
</property> <------------------------------------------------------ remove this
<property name="lastName" type="string" column="LastName"/>
</property> <------------------------------------------------------ remove this
<property name="program" type="string" column="Program"/>
</property> <------------------------------------------------------ remove this

Those closing </property> tags aren't closing no one, as the <property tags above them are self-closed (notice the />).