2013-05-19 123 views
4

我知道这个问题已经被问了很多,但我几乎读了其中每一个,但他们中没有人帮助过我。 我正在写与Hibernate一个eclipse的maven项目,我得到这个错误:org.hibernate.InvalidMappingException:无法解析来自资源的映射文档* .hbm.xml

org.hibernate.InvalidMappingException: Could not parse mapping document from resource ir/ac/ut/ieproj/da/Student.hbm.xml 

我的文件是这样的:

的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; 
    } 

} 

我认为这个问题是许多到一标记在Student.hbm.xml中,因为Department.hbm.xml和namedQuery内不会导致错误。我究竟做错了什么?我正在使用mvn软件包制作一个.war文件,然后将其部署到tomcat 7.

回答

8

错误Could not parse mapping document是关于您的xml文件而不是是格式良好的。当这个错误出现时,我们最好仔细检查我们的xml文件,看看它们是否确实正确(所有标签都已正确关闭等)。


就你的情况而言,正如消息所述,你的Student.hbm.xml文件是问题所在。您有不属于某些标签:

<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 

那些关闭</property>标签不关闭任何人,因为<property标签上面他们是自我封闭(注意/>)。

+1

后,我猜它的有关文件和语法,所以我检查20次,但找不到任何错误。猜猜需要第二个人来为我检查,谢谢 –

0

可能是因为与Bean类中使用的变量名称不匹配而导致此问题。

例如, 然后你的变量名应该是名字。

-1

你只要闭上你的财产像

<property name="firstName" type="string" column="FirstName" /> 

<property name="firstName" type="string" column="FirstName"></property> 
0

在我的例子只是一个在XML的beggining评论。 如果有人有评论就像删除它,也许会工作。

0

请从您的映射和配置文件中删除<?xml version="1.0"?>。它将解决您的问题

0

您可能已经为相同的实体/持久性配置了多次映射标记。

相关问题