Spring3和hibernate4整合的一点小问题

其实这个问题在第一次使用hibernate4的时候就发现了,当时没怎么管,由于后来换用了mybatis。 java

如今又从新一个项目,用hibernate4来作,就出现了这个问题,鼓捣了好久,保存数据一直提示个人User类不是一个Entity,还好上次无心间发现了解决办法,否则我又得放弃hibernate了。 spring


废话很少说了,切入正题: 数据库


你们都知道,hibernate和spring整合的方式有两种, session

一种是写hibernate.cfg.xml,而后在spring配置文件中配置sessionFactory的时候引入这个配置文件就能够了 mybatis

第二种是直接将数据库的链接写在spring配置文件中,建一个dataSource的bean app


我用的是第一种,而后经过以下代码引入的*.hbm.xml文件: ui

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<!-- hibernate配置文件 -->
		<property name="configLocations">
			<value>classpath:/com/singlesing/cfg/hibernate.cfg.xml</value>
		</property>
		<!-- mapping配置文件 -->
		
		<property name="mappingLocations">
			<list>
				<value>classpath:/com/singlesing/bean/mapping/*.hbm.xml</value>
			</list>
		</property>
		 
	</bean>



这种方式一次性直接添加了全部的hbm.xml文件,节约了不少行代码,固然这种方式也没有错,加载spring配置文件,也能够自动建表,一切看来彷佛都正常。

但是在对这些实体类操做的时候,就会报Unknown entity这个错误。出错后,我把hbm.xml文件改写在hibernate.cfg.xml文件中,就没有这个问题了。 spa


我考虑了一下,缘由应该是当我要操做一个实体类的时候,我首先要获取session,获取session的代码以下: hibernate

package com.singlesing.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

@SuppressWarnings("deprecation")
public class HibernateUtil {
	
	private static SessionFactory sessionFactory;
	
	static{
		Configuration cfg = new Configuration().configure("com/singlesing/cfg/hibernate.cfg.xml");//注意这里
		sessionFactory = cfg.buildSessionFactory();
	}
	
	@SuppressWarnings("rawtypes")
	public static final ThreadLocal session = new ThreadLocal();
	
	@SuppressWarnings("unchecked")
	public static Session getCurrentSession()throws Exception{
		Session s = (Session)session.get();
		if (s == null) {
			s = sessionFactory.openSession();
			session.set(s);
		}
		return s;
	}
	
	public static void closeSession()throws Exception{
		Session s = (Session)session.get();
		if (s != null) {
			s.close();
		}
	}
}



能够看到我在代码中的注释,获取session的时候经过读配置文件得到sessionFactory再建立的,在hibernate.cfg.xml中根被没有配置*.hbm.xml,因此会找不到。


我想应该是这样,总之这样能够解决,可是要多些点代码了,不过也就写一次,不须要大的改动,也不太影响,不知道你们怎么解决这个问题,也没时间去查资料了,夜深了,得赶忙睡觉了。 code

相关文章
相关标签/搜索