关于spring整合hibernate的一些概念
最近初学spring,整合hibernate遇到了种种问题,包括sessionfactory的注入;
(1):spring的自带的实现sessionfactory接口的类AnnotationSessionFactoryBean(其实源代码中并没有实现此接口,但是sessionfactory的方法初始化的时候被动态切入到此类当中),beans.xml如下:
<beanid="sessionFactory"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<propertyname="dataSource"ref="dataSource"/>
<propertyname="annotatedClasses">
<list>
<value>com.shelley.model.User</value>
</list>
</property>
<propertyname="hibernateProperties">
<!--<value>
hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
</value>-->
<props>
<propkey="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<propkey="hibernate.show_sql">true</prop>
<!--<propkey="hibernate.jdbc.use_get_generated_keys">false</prop>-->
</props>
</property>
</bean>
对以上的配置信息中可以看到:参数1为:dataSource,即注入数据源连接池类,此类同样可以通过spring来指定;参数2为:表映射的实体类的数组;参数3:为注入一些hibernate一些配置参数,由AnnotationSessionFactoryBean的父类中方法publicvoidsetHibernateProperties(PropertieshibernateProperties){
this.hibernateProperties=hibernateProperties;
} 来实现,是一个Properties数据类型 。
(2):Transactionannotationproperties主要分为propagation,isolation,readOnly,timeout,rollbackFor,rollbackForClassname,noRollbackFor,noRollbackForClassname
propertiespropagation:分为
MANDATORY,NESTED,NEVER,NOT_SUPPORTED,REQUIRED,REQUIRED_NEW,SUPPORTS
最常用的是REQUIRED如果当前没有Transaction,则创建一个;REQUIRED_NEW则是直接创建新的事物,挂起当前事务。
NESTED,嵌套事务处理,回滚到保存点操作,不常用。
propertiesreadOnly不容许进行删除,插入,更新数据库的操作,一般是提高性能之用。
propertiesrollbackFor回滚原因设置,默认是RuntimeException,一般不用设。
大多数情况下,事务管理都是XML配置。
(3):HibernateTemplate,HibernateCallback,HibernateDaoSupport(不重要);
HibernateTemplate用来简化如trycatchfinally这些代码块,实现类org.springframework.orm.hibernate3.HibernateTemplate,需要注入SessionFactory类。
======================================================================
<1>设计模式:TemplateMethod
<2>Callback:回调/钩子函数
<3>第一种:(建议)
a.在spring中初始化HibernateTemplate,注入sessionFactory
b.DAO里注入HibernateTemplate
c.save写hibernateTemplate.save();
可以写一个SuperDao来注入HibernateTemplate,然后其他Dao来继承。。。
<4>第二种:(不常用)
a.从HibernateDaoSupport继承
b.必须写在XML中,无法使用Annotation,因为set方法在父类中,且是final的。
======================================================================
待续 ,继续学习补充中 。