电脑报警分析
2010-08-21 08:04
246 查看
HibernateTemplate是Spring当中一个很方便的类,主要用于Hibernate中的DAO类中,对数据库记录进行直接操作,常用方法有(这里偷个懒,不把重载方法都一一列出来了,只有方法名以及简单功能介绍):
get 从数据库相关表中获取一条记录并封装返回一个对象(Object)
load 作用与get基本相同,不过只有在对该对象的数据实际调用时,才会去查询数据库
save 添加记录
saveOrUpdate 判断相应记录是否已存在,据此进行添加或修改记录
update 修改记录
delete 删除记录
HibernateTemplate介绍就到这里,接下来我们考虑其使用。
既然是Spring,我们当然要用到IOC了(不知道IOC?问谷老师去!),注入次序是:
DataSource ->
SessionFactory ->
HibernateTemplate ->
DAO
以下是相关代码:
applicationContext.xml
PlantDao.java
这里的main方法主要是用于测试,当然更标准的测试需要使用Junit。注意在Spring中applicationContext默认是放在WEB-INF目录中,但为了测试方便我把它放在src里了。
因为所有DAO类中都会有HibernateTemplate的bean方法,于是
这段代码就会大量重复。
考虑到复用性,我们将这段代码封装在独立的类中,让所有DAO类继承。不过这个类Spring已经有了,那就是HibernateDaoSupport(除此之外,HibernateDaoSupport也有SessionFactory的bean方法),于是PlantDao.java可以简化为:
PlantDao.java
到目前为止,我们所使用的是XML的注入方式,那么如果用annotation呢?
如果实际测试一下,你会发现出现了类似底下的异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'plantDao' defined in file [E:\javaWorks\plantAtlas\WebRoot\WEB-INF\classes\dj\dao\PlantDao.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
它找不到SessionFactory或者HibernateTemplate,即SessionFactory或者HibernateTemplate没有注入给DAO类!
原因在于HibernateDaoSupport的setter方法前并没有加入@Resource这样的注解,并且它的所有bean方法都是不可改写的(final),这就相当于你的DAO类和HibernateTemplate都被实例化了(DAO实例化需要使用@Component注解)但DAO实例并没有被注入HibernateTemplate,即:
DataSource ->
SessionFactory ->
HibernateTemplate ,DAO
HibernateTemplate与DAO之间的注入关系断开了
解决此问题的方法是:
重写一个加入了
@Recource
的
HibernateDaoSupport
的替代类,让
DAO
类继承
以下是使用annotation方式注入的相关代码:
applicationContext.xml
PlanteDao.java
SuperDao.java
测试,ok!
到此算讲完了,这是我的第一篇关于程序开发的博客,欢迎各位拍砖。
以上!
get 从数据库相关表中获取一条记录并封装返回一个对象(Object)
load 作用与get基本相同,不过只有在对该对象的数据实际调用时,才会去查询数据库
save 添加记录
saveOrUpdate 判断相应记录是否已存在,据此进行添加或修改记录
update 修改记录
delete 删除记录
HibernateTemplate介绍就到这里,接下来我们考虑其使用。
既然是Spring,我们当然要用到IOC了(不知道IOC?问谷老师去!),注入次序是:
DataSource ->
SessionFactory ->
HibernateTemplate ->
DAO
以下是相关代码:
applicationContext.xml
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/myDB"/> <property name="username" value="root"/> <property name="password" value="abc"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="annotatedClasses"> <list> <value>dj.pojo.Plant</value> </list> </property> <property name="hibernateProperties"> <value> hibernate.dialect = org.hibernate.dialect.MySQLDialect hibernate.show_sql = true hibernate.format_sql = true hbm2ddl.auto = create </value> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="plantDao" class="dj.dao.PlantDao"> <property name="hibernateTemplate" ref="hibernateTemplate"/> </bean>
PlantDao.java
public class PlantDao{ private HibernateTemplate hibernateTemplate; public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } public void save(Plant plant){ this.getHibernateTemplate().save(plant); } public static void main(String[] args){ ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); PlantDao pd=(PlantDao) ctx.getBean("plantDao"); Plant plant=new Plant(); plant.setName("data"); pd.save(plant); } }
这里的main方法主要是用于测试,当然更标准的测试需要使用Junit。注意在Spring中applicationContext默认是放在WEB-INF目录中,但为了测试方便我把它放在src里了。
因为所有DAO类中都会有HibernateTemplate的bean方法,于是
private HibernateTemplate hibernateTemplate; public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; }
这段代码就会大量重复。
考虑到复用性,我们将这段代码封装在独立的类中,让所有DAO类继承。不过这个类Spring已经有了,那就是HibernateDaoSupport(除此之外,HibernateDaoSupport也有SessionFactory的bean方法),于是PlantDao.java可以简化为:
PlantDao.java
public class PlantDao extends HibernateDaoSupport{ public void save(Plant plant){ this.getHibernateTemplate().save(plant); } public static void main(String[] args){ ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); PlantDao pd=(PlantDao) ctx.getBean("plantDao"); Plant plant=new Plant(); plant.setName("data"); pd.save(plant); } }
到目前为止,我们所使用的是XML的注入方式,那么如果用annotation呢?
如果实际测试一下,你会发现出现了类似底下的异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'plantDao' defined in file [E:\javaWorks\plantAtlas\WebRoot\WEB-INF\classes\dj\dao\PlantDao.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
它找不到SessionFactory或者HibernateTemplate,即SessionFactory或者HibernateTemplate没有注入给DAO类!
原因在于HibernateDaoSupport的setter方法前并没有加入@Resource这样的注解,并且它的所有bean方法都是不可改写的(final),这就相当于你的DAO类和HibernateTemplate都被实例化了(DAO实例化需要使用@Component注解)但DAO实例并没有被注入HibernateTemplate,即:
DataSource ->
SessionFactory ->
HibernateTemplate ,DAO
HibernateTemplate与DAO之间的注入关系断开了
解决此问题的方法是:
重写一个加入了
@Recource
的
HibernateDaoSupport
的替代类,让
DAO
类继承
以下是使用annotation方式注入的相关代码:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config /> <context:component-scan base-package="dj.dao"/> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/myDB"/> <property name="username" value="root"/> <property name="password" value="abc"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="annotatedClasses"> <list> <value>dj.pojo.Plant</value> </list> </property> <property name="hibernateProperties"> <value> hibernate.dialect = org.hibernate.dialect.MySQLDialect hibernate.show_sql = true hibernate.format_sql = true hbm2ddl.auto = create </value> </property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> </beans>
PlanteDao.java
@Component public class PlantDao extends SuperDao{ public void save(Plant plant){ this.getHibernateTemplate().save(plant); } public static void main(String[] args){ ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); PlantDao pd=(PlantDao) ctx.getBean("plantDao"); Plant plant=new Plant(); plant.setName("sae"); pd.save(plant); } }
SuperDao.java
public class SuperDao { private HibernateTemplate hibernateTemplate; public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } @Resource public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; System.out.println("hibernateTemplate is null:"+hibernateTemplate==null); } }
测试,ok!
到此算讲完了,这是我的第一篇关于程序开发的博客,欢迎各位拍砖。
以上!
相关文章推荐
- [安全分析报告]门磁报警系统破解猜想
- 电脑开机报警声
- 电脑主板报警声音的故障现象对照表
- Android-vold源码分析之连接电脑OTG(11)
- 电脑报警声全攻略
- Ceilometer项目源码分析----ceilometer分布式报警系统的具体实现(2)
- 原创bat【记录电脑何时掉包】【可报警】
- 从BIOS自检报警声判断电脑故障
- 日志分析邮件报警脚本(crontab */10 * * * *)
- 根据主板报警音排除电脑故障
- 分析电脑控制的丹佛机场行李系统
- 诡异的磁盘空间100%报警分析得出df -h与du -sh *的根本性差别
- 电脑自动重启故障分析解决
- 电脑自动重启故障分析解决
- 电脑屏幕无信号,鼠标键盘无信号的问题分析
- 电脑启动时蓝屏分析与解决办法
- 电脑运行缓慢分析与排除
- 电脑启动故障分析思路
- 电脑开机出现警报音后提示要按F1才能进入的分析处理
- 『电脑网络』 [操作系统]XP系统启动原理及故障原因分析(译文)(转载)