spring与hibernate整合之HibernateDAOSupport
来源:互联网 发布:高清网络电视在线观看 编辑:程序博客网 时间:2024/05/17 09:05
将spring与hibernate进行整合之后,我们都希望用spring来管理DAO层,这样有利于快速实现功能,少出错。
今天在研究在DAO层编码,采用继承HibernateDAOSupport方式时,发现网上许多人说的都是错的,既然已经继承DAOSupport了,就不应该在DAO层中再有对SessionFactory的注入了。如果注入了,不跟没有用DAOSupport一样了么?或者接近于hibernateTemplate方法了。
我想,既然用了DAOSupport,它里面有了getHibernateTemplate和setSessionFactory方法,且是final的,那么我们就应该直接将SessionFacotry注入到里面。
后来,几经查阅,原来问题在这里。
在spring的配置文件中:写了sessionFactory的bean之后,继承HibernateDAOSupport,发现会报错,说”sessionFactory ” or “hibernateTemplate ” is required。。。
原因在于,spring没有能将我们在配置文件中写的bean注入到HibernateDAOSupport中,因为spring默认情况下是不会自动装配的。
如果我们指定了默认装配,通过看spring原码,发现它调用了HibernateDAOSupport中的setSessionFactory方法,然后生成了一个hibernateTemplate。进而我们可以使用。
如果再研究一下,会发现一个比较怪的现象:
在spring中的bean中,它的class是:
但看spring的源码,它的HibernateDAOSupport类中的setSessionFactory方法中,SessionFactory的类型是org.hibernate.SessionFactory。
这到底是如何转换的呢?又看spring的源码,发现了问题。
原来,AnnotationSessionFactoryBean继承了LocalSessionFactoryBean,而在LocalSessionFactoryBean中,有方法buildSessionFactory,它返回值的类型就是org.hibernate.SessionFactory.通过走断点,我们也的确看到它是走的这个方法。
因此呢,spring是通过自己的方法,实现了hibernate的sessionFacotry。也正是如此,我们既可以用byName,也可以用byType,让它能装配就可以了。
解决方法一:最简单的就是在spring的配置文件的头部,写上:default-autowire=”byName”>或者byType 如果是byName,SessionFactory的bean名字必须是sessionFactory.
解决方法二:在Dao层加上:
@Autowired public void setSuperSessionFactory(SessionFactory sessionFactory){ super.setSessionFactory(sessionFactory); }
虽然final方法不能重写,但是可以调用,而在调用的时候,把sessionFactory给注入进去就可以了。
也正是解决方法二,让我进一步了解到了spring的xml与annotation的区别:
二者都是为我们进行注入操作,但二者是有重要区别的。
在xml,spring是通过bean的id(XXX),然后调用被注入类的setXXX的方法,如此进行注入。
而在annotation的autowired中,它是通过方法中参数的类来进行注入。也就是setYYY(XXX x) 中的XXX与bean的配置进行对应。
这也就理解了方法二可以正确运行的原因。
注:在required中,如果没有指定名字,则是根据把set后面的第一个字母小写后,当作名字来寻找bean.找不到,则按type找。
解决方法三:由于我们不能对其注入的主要原因是,hibernateDaoSupport中的set方法是final的,我们不能重写。因此,我们可以尝试对于这个bean,我们不写@component标签,而是通过xml方式进行注入。
因此可以在配置文件中写上:
<bean name="userDAO" class="com.msb.dao.UserDAOImpl"> <property name="sessionFactory" ref="mySessionFactory"></property> </bean>
在实现层直接就写:
public class UserDAOImpl extends HibernateDaoSupport implements UserIDAO{ public void save(User user){ this.getHibernateTemplate().save(user); }}
就可以了。
解决方法四:用Annotation中的Resouce标签:(先按名字寻找,再按类型查找)
@Component /* * 由于HibernateDaoSupport中的setSessionFactory与setHibernateTemplate都是final的。不能重写。 */public class UserDAOImpl extends HibernateDaoSupport implements UserIDAO{ @Resource(name="hibernateTemplate") public void setSuperHibernateTemplate(HibernateTemplate hibernateTemplate){ super.setHibernateTemplate(hibernateTemplate); } public void save(User user){ this.getHibernateTemplate().save(user); }}
<bean id="hibernateTemplate" > <property name="sessionFactory" ref="mySessionFactory"></property> </bean>
- spring与hibernate整合之HibernateDAOSupport
- Spring整合hibernate(3)之基于HibernateDaoSupport的整合
- spring与hibernate整合之:继承HibernateDAOSupport方式+理解xml与AutoWired、Resource的区别
- spring与hibernate整合之:继承HibernateDAOSupport方式+理解xml与AutoWired、Resource的区别
- spring框架使用HibernateDaoSupport整合Hibernate框架
- Spring学习_07_Spring整合Hibernate(HibernateTemplate,HibernateDaoSupport)
- Spring整合Hibernate,不用HibernateDaoSupport与HibernateTemplate而用Hibernate自己的api分析说明
- Spring整合Hibernate,不用HibernateDaoSupport与HibernateTemplate而用Hibernate自己的api分析说明
- Spring与Hibernate整合的HibernateDaoSupport应用中的“内存泄露”问题(学习心得)
- Spring与Hibernate整合的HibernateDaoSupport应用中的“内存泄露”问题(学习心得)
- hibernate 与spring结合,hibernatedaoSupport使用注意事项
- 继承HibernateDaoSupport实现DAO(spring整合hibernate)
- Spring整合hibernate:HibernateTemplate和HibernateDaoSupport实现数据库操作
- Spring 整合 Hibernate、声明式的事务管理、HibernateTemplate(HibernateDaoSupport)
- 继承HibernateDaoSupport实现DAO(spring整合hibernate)
- spring入门(12)-spring与hibernate整合完成增删改查的操作(继承HibernateDaoSupport调用hibernateTemplate类)
- spring入门(12)-spring与hibernate整合完成增删改查的操作(继承HibernateDaoSupport调用hibernateTemplate类)
- Spring整合Hibernate之AnnotationSessionFactoryBean与LocalSessionFactoryBean
- 二分查找(C语言)
- linux百度云工具baidu pcs
- jdk 安装 linux
- php 读取sqlserver 2008 image类型(二进制)字段被截断问题(mssql.textsize)
- 慕课响应式小细节
- spring与hibernate整合之HibernateDAOSupport
- Suppressed: java.lang.ClassNotFoundException: android.support.v7.internal.widget.ActionBarContainer
- HDU 2602 Bone Collector(01背包)
- ArcGIS API for Android解惑:Callout不能调整弹出框大小
- 消息队列-链表实现
- 首发
- 【路径大全】iphone所有文件路径。CYDIA
- Android网络操作和优化相关
- HDU 2602 -Bone Collector