我下载了一个教程项目,试图让Spring和Hibernate工作。但是,在服务器上运行后,我收到此消息:
Invocation of init method failed; nested exception is org.hibernate.MappingNotFoundException: resource: net/codejava/spring/model/User.hbm.xml not found
这是我的项目结构:
hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<mapping resource="net/codejava/spring/model/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
user.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="net.codejava.spring.model">
<class name="User" table="users">
<id name="id" column="user_id">
<generator class="native"/>
</id>
<property name="username" column="username" />
<property name="password" column="password" />
<property name="email" column="email" />
</class>
</hibernate-mapping>
servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<context:component-scan base-package="net.codejava.spring" />
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://domain:3306/databaseHere"/>
<property name="username" value="insertUserHere"/>
<property name="password" value="insertPassHere"/>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>
<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="userDao" class="net.codejava.spring.dao.UserDAOImpl">
<constructor-arg>
<ref bean="sessionFactory" />
</constructor-arg>
</bean>
</beans>
关于出了什么问题的任何想法?
答案 0 :(得分:1)
您有一个maven
项目,因此User.hbm.xml
应该在src/main/resources/
内,而不是src/main/java
当您构建maven项目时,它编译的是.java
中存在的src/main/java
文件,它不会考虑此目录中存在的任何其他文件。所以maven项目有一个文件夹结构src/main/resources
,您可以在其中放置所有配置文件,如.xml, .properties
等。因此,当您构建maven项目时,它将编译来自src/main/resources
的所有Java文件并将.class
文件放在类路径中,maven也会复制src/main/resources
中的所有资源并将它们放在类路径中。因此,当您运行应用程序时,配置文件也将在类路径中可用。
但是如果您只是将配置文件放在src/main/java
中,那么maven将忽略它们,因此它们在类路径中不可用。
但是如果您正在处理的项目是一个简单的java项目而不是maven项目,那么即使您在src/main/java
中拥有配置文件,问题中提到的代码设置也可以正常运行。希望这个解释有所帮助。
要确保maven项目正确构建,您可以通过打开目录target/classes/
然后打开配置文件的路径来验证。
所以,总结所有这些信息,这就是你需要做的事情:
在/src/main/resources
中创建一个模仿/src/main/java
中的包结构的包结构 - 也就是说,在net.codejava.spring.model
中创建/src/main/resources
包并将User.hbm.xml
放在那里。运行Maven clean package
(或其他一些构建目标)命令后,User.hbm.xml
文件将位于正确的位置(下图中未显示) - /target/SpringMvcHibernateXML-1.0.0-BUILD-SNAPSHOT/WEB-INF/classes/net/codejava/spring/model/User.hbm.xml
。
最终,在Maven中构建之后,项目应该如下所示: