Spring : 集成Hibernate 理解LocalSessionFactoryBean
2014-01-11 15:23
363 查看
1、LocalSessionFactoryBean的使用
LocalSessionFactoryBean(org.springframework.orm.hibernate4.LocalSessionFactoryBean)是Spring和Hibernate集成的重要类。
通过在Spring的配置文件applicationContext.xml中配置LocalSessionFactoryBean作为SessionFactory创建,在创建的时候会加载
mappingResource中的具体每一个实体和具体表映射配置 XXX.hbm.xml。
若配置的映射文件较少时,可以用sessionFactory的所属类LocalSessionFactoryBean的“mappingResources”属性,方式包括
(mappingResources,mappingLocations、mappingDirectoryLocations与mappingJarLocations )定义方法如下:
第一种:
当配置文件变得越来越多,阅读和修改起来也越来越麻烦,而且基于XML的配置也可能带来输入的错误,导致你可能因为一个字符的
错误而浪费半天时间去寻找错误。
第二种
在这种情况下,可以使用LocalSessionFactoryBean的“mappingDirectoryLocations”属性来定义映射文件,只要指出映射文件所在文
件夹就可以了,Spring会替你找出该文件夹内所有的映射文件,定义方法如下:
2、LocalSessionFactoryBean的原理
具体的Bean为LocalSessionFactoryBean,那为什么id为SessionFactory,实际上的Bean也是SessionFactory
LocalSessionFactoryBean 本身不是一个session
factory,但是spring会自动把对这个bean的引用替换成LocalSessionFactoryBean
里面的真正的session factory。
我们先来看看LocalSessionFactoryBean 源码如下,实现了AbstractSessionFactoryBean抽象类
而在AbstractSessionFactoryBean这个抽象类中具体如下,实现了接口FactoryBean<SessionFactory>,接口的类型设置SessionFactory
接下来我们看看具体的源码接口FactoryBean<SessionFactory>
1、getObject()返回一个对象,则需要在具体的实现类中具体看
2、getObjectType()获取对象的类型Type
3、isSingLeton()判断是否为单列模式
通过实现FactoryBean<SessionFactory>接口来使用上面的三个方法,我们在AbstractSessionFactoryBean抽象类的实现中使用
implementsFactoryBean<SessionFactory>,也就是Type类型为SessionFactory类型,也就是getObject该方法实际
返回的是SessionFactory类型,具体我们看看在AbstractSessionFactoryBean中三个方法的实现
也就是在AbstractSessionFactoryBean抽象类中有存放sessionFactory的字段,而且是private私有的,而获取方法
是公有的,现在我们回到LocalSessionFactoryBean ,因为LocalSessionFactoryBean 实现了抽象类AbstractSessionFactoryBean,
也就是继承了方法getObject()方法,该方法在AbstractSessionFactoryBean抽象类中是回去私有变量SessionFactory的
所以当我们实际使用这个LocalSessionFactoryBean 的时候,比如applicationContext.getBean("localSessionFactoryBean "),
spring返回的不是LocalSessionFactoryBean 本身,而会自动调用getObject()这个方法,而这个方法把真正的session
factory返回
用<ref bean="">这样引用也一样,得到的都是session factory而不是LocalSessionFactoryBean 。所以不需要再显式地创建一个
session
factory,直接引用LocalSessionFactoryBean 就可以了。
LocalSessionFactoryBean(org.springframework.orm.hibernate4.LocalSessionFactoryBean)是Spring和Hibernate集成的重要类。
通过在Spring的配置文件applicationContext.xml中配置LocalSessionFactoryBean作为SessionFactory创建,在创建的时候会加载
mappingResource中的具体每一个实体和具体表映射配置 XXX.hbm.xml。
若配置的映射文件较少时,可以用sessionFactory的所属类LocalSessionFactoryBean的“mappingResources”属性,方式包括
(mappingResources,mappingLocations、mappingDirectoryLocations与mappingJarLocations )定义方法如下:
第一种:
<!--mappingResources属性用来列出全部映射文件--> <property name="mappingResources"> <list> <value>ExUser.hbm.xml</value> </list> </property>
当配置文件变得越来越多,阅读和修改起来也越来越麻烦,而且基于XML的配置也可能带来输入的错误,导致你可能因为一个字符的
错误而浪费半天时间去寻找错误。
第二种
在这种情况下,可以使用LocalSessionFactoryBean的“mappingDirectoryLocations”属性来定义映射文件,只要指出映射文件所在文
件夹就可以了,Spring会替你找出该文件夹内所有的映射文件,定义方法如下:
<property name="mappingDirectoryLocations"> <list> <value>WEB-INF/mappings</value> </list> </property>
2、LocalSessionFactoryBean的原理
具体的Bean为LocalSessionFactoryBean,那为什么id为SessionFactory,实际上的Bean也是SessionFactory
<bean id="SessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!--依赖注入数据源datasource--> <property name="dataSource" ref="DataSource" /> <!--mappingResources属性用来列出全部映射文件--> <property name="mappingResources"> <list> <value>ExUser.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.hbm2ddl">validate</prop> <prop key="hibernate.generate_statistics">true</prop> <prop key="hibernate.connection.release_mode">auto</prop> <prop key="hibernate.autoReconnect">true</prop> <prop key="hibernate.cglib.use_reflection_optimizer">true</prop> </props> </property> </bean>
LocalSessionFactoryBean 本身不是一个session
factory,但是spring会自动把对这个bean的引用替换成LocalSessionFactoryBean
里面的真正的session factory。
我们先来看看LocalSessionFactoryBean 源码如下,实现了AbstractSessionFactoryBean抽象类
public class LocalSessionFactoryBean extends AbstractSessionFactoryBean implements BeanClassLoaderAware {
而在AbstractSessionFactoryBean这个抽象类中具体如下,实现了接口FactoryBean<SessionFactory>,接口的类型设置SessionFactory
public abstract class AbstractSessionFactoryBean implements FactoryBean<SessionFactory>, InitializingBean, DisposableBean, PersistenceExceptionTranslator {
接下来我们看看具体的源码接口FactoryBean<SessionFactory>
package org.springframework.beans.factory; public interface FactoryBean<T> { T getObject() throws Exception; Class<?> getObjectType(); boolean isSingleton(); }从源码中可以看到Spring给我们接口FactoryBean<SessionFactory>很简单但是也很强大,只有三个方法
1、getObject()返回一个对象,则需要在具体的实现类中具体看
2、getObjectType()获取对象的类型Type
3、isSingLeton()判断是否为单列模式
通过实现FactoryBean<SessionFactory>接口来使用上面的三个方法,我们在AbstractSessionFactoryBean抽象类的实现中使用
implementsFactoryBean<SessionFactory>,也就是Type类型为SessionFactory类型,也就是getObject该方法实际
返回的是SessionFactory类型,具体我们看看在AbstractSessionFactoryBean中三个方法的实现
public abstract class AbstractSessionFactoryBean implements FactoryBean<SessionFactory>, InitializingBean, DisposableBean, PersistenceExceptionTranslator { private SessionFactory sessionFactory; ... /** * Return the singleton SessionFactory. */ public SessionFactory getObject() { return this.sessionFactory; } public Class<? extends SessionFactory> getObjectType() { return (this.sessionFactory != null ? this.sessionFactory.getClass() : SessionFactory.class); } public boolean isSingleton() { return true; } }
也就是在AbstractSessionFactoryBean抽象类中有存放sessionFactory的字段,而且是private私有的,而获取方法
是公有的,现在我们回到LocalSessionFactoryBean ,因为LocalSessionFactoryBean 实现了抽象类AbstractSessionFactoryBean,
也就是继承了方法getObject()方法,该方法在AbstractSessionFactoryBean抽象类中是回去私有变量SessionFactory的
所以当我们实际使用这个LocalSessionFactoryBean 的时候,比如applicationContext.getBean("localSessionFactoryBean "),
spring返回的不是LocalSessionFactoryBean 本身,而会自动调用getObject()这个方法,而这个方法把真正的session
factory返回
用<ref bean="">这样引用也一样,得到的都是session factory而不是LocalSessionFactoryBean 。所以不需要再显式地创建一个
session
factory,直接引用LocalSessionFactoryBean 就可以了。
相关文章推荐
- Spring集成Hibernate 理解LocalSessionFactoryBean
- Spring集成Hibernate 理解LocalSessionFactoryBean
- Hibernate与Spring整合的一些配置问题(一)——LocalSessionFactoryBean
- spring LocalSessionFactoryBean转换为hibernate 的sessionfactory
- Spring整合Hibernate之AnnotationSessionFactoryBean与LocalSessionFactoryBean
- Spring整合Hibernate之AnnotationSessionFactoryBean与LocalSessionFactoryBean
- Spring与Hibernate整合时的核心类LocalSessionFactoryBean详解
- Spring 中的 LocalSessionFactoryBean和LocalContainerEntityManagerFactoryBean
- LocalSessionFactoryBean加载Hibernate 映射的几种方式及区别
- LocalSessionFactoryBean为什么能注入到HibernateDaoSupport
- 关于Spring中配置LocalSessionFactoryBean来生成SessionFactory
- 总结LocalSessionFactoryBean加载Hibernate映射方式
- LocalSessionFactoryBean有几个属性查找hibernate映射文件
- Spring+Hibernate集成后事务与Session的一些理解。
- Spring加载Hibernate失败:Error creating bean with name 'sessionFactory' defined in ServletContext... Null
- 重构Mybatis与Spring集成的SqlSessionFactoryBean(1)
- 深入浅出重构Mybatis与Spring集成的SqlSessionFactoryBean(上)
- 关于Spring中配置LocalSessionFactoryBean来生成SessionFactory
- 关于Spring中配置LocalSessionFactoryBean来生成SessionFactory
- Spring中LocalSessionFactoryBean与SessionFactory