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

相關文章
相關標籤/搜索