springmvc+spring+hibernate整合详解注解形式事物管理
- 格式:docx
- 大小:187.50 KB
- 文档页数:32
Springmvc4+spring4+hibernate4整合步骤前言:(声明式事务管理采用配置文件来配置事物)准备工作:1/安装并配置java运行环境2/数据库的安装配置(Mysql)3/安装并配置服务器(Tomcat)4/Maven5/ IntelliJIDEA的安装配置(本人使用的主要软件是IntelliJIDEA,没用eclipse什么的)6/ 使用IntelliJIDEA创建一个web app项目。
一、在pom.xml文件中引入相关框架整合的依赖二、SpringMvc配置:我们先配置下SpringMVC的配置:resources/META-INF/spring-mvc.xml(也可以把OK,SpringMVC配置完成,现在我们进行一下测试吧在controller层新建一个TestController,内容如下test.jsp网页如下:重启Tomcat服务器,然后浏览器访问localhost:8080/test如下图所示:三、springmvc+Spring整合这个就十分简单了,配置applicationContext.xml这个Spring的配置文件如下:完善web.xml配置文件如下:(applicationContext.xml在META-INF文件夹下配置如下),如果直接在resources下配置:classpath*:/applicationContext.xmlweb.xml配置文件中更改了三处:引入Spring配置文件Spring的监听器以及字符集过滤,以及加载Spring上下文配置OK,Spring+SpringMVC配置完成,下面我们开始测试:在service写一个TestServiceImpl实现TestService接口并实现其test()方法,代码如下:TestServiceTestServiceImplTestController更改如下:控制器这里我们运用了Spring的依赖注入自动装配。
在浏览器中输入地址http://localhost/springtest调用springtest方法四、springmvc+spring+hibernate整合整体的文件结构我们先编写config.properties这个配置文件,里面存放的是hibernate的一些配置ehcache.xml缓存配置文件(二级缓存用)下面配置hibernate,这里我为了方便,就直接写进applicationContext.xml里面。
配置后的applicationContext.xml如下:spring-mvc.xml配置修改web.xml配置完善log4j.propertiesOK,到了这里,配置结束。
下面进入测试阶段实体类(entity):公共数据库访问层:PS:我这里显示写了一个比较通用的接口,其他所有接口皆继承此接口,再编写实现类注意:我这里写的session产生是调用的SessionFactory的openSession()这个方法。
之前使用getCurrentSession()一直报错,后来百度了一下才知道,hibernate3版本可以使用getCurrentSession()来创建session,而hibernate4版本则不行。
服务层(service):控制层(controller):五、总结实现Spring+SpringMVC+hibernate框架整合步骤,1、配置spring-mvc.xml配置文件启动Springmvc的注解驱动:annotation-driven配置视图扫描包:<context:component-scan base-package="com.ssh"/>配置静态资源映射:以上就配置好了基本的spring-mvc.xml如要扩展功能可以配置防止ie加载ajax时出错、json转换器、文件上传下载:中的乱码问题整合hibernate时,必须配:3、Spring和hibernate整合配置文件配置扫描数据库配置文件,配置数据源,配置sessionFactory,配置事物管理,配置语义化六、搭建框架遇到的问题1、hibernate使用sessionFactory创建session时,两种方式的区别:1. openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。
2. getCurrentSession ,从字面上可以看得出来,是获取当前上下文一个session对象,当第一次使用此方法时,会自动产生一个session对象,并且连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一,简单而言,getCurrentSession 就是:如果有已经使用的,用旧的,如果没有,建新的。
注意:在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务(即是使用一个数据库的情况),所以在一般情况下比较少使用openSession 或者说openSession是比较老旧的一套接口了;对于getCurrentSession 来说,有以下一些特点:1.用途,界定事务边界2.事务提交会自动close,不需要像openSession一样自己调用close方法关闭session3.上下文配置(即在hibernate.cfg.xml)中,需要配置:<property name="current_session_context_class">thread</property>(需要注意,这里的current_session_context_class属性有几个属性值:jta 、thread 常用, custom、managed 少用 )a).thread使用connection 单数据库连接管理事务b).jta (java transaction api)Java 分布式事务管理(多数据库访问),jta 由中间件提供(JBoss WebLogic 等,但是tomcat 不支持)2、关于oracle和mysql数据库问题<1>使用mysql数据库时,默认为MyISAM数据引擎,可惜此引擎不支持事务处理,我们需要将默认的数据引擎改为InnoDB,开启方法:1)关闭mysql的服务2)修改my.ini(linux下是f)将default-storage-engine=INNODB前的注释(#)去掉将skip-innodb这行注释(加上#)3)保存后重启mysql服务id字段标识自动递增的注解为:@GeneratedValue(strategy=GenerationType.IDENTITY)<2>使用oracle数据库时,默认id字段不能设置自动递增,如果要使得id字段自动递增,需要为表设置序列以实现,字段的递增,红色的前面的是表名称,接着是递增字段id字段标识自动递增的注解为:@GeneratedValue(strategy=GenerationType.SEQUENCE)<3>hibernate 中方法使用总结:get和load的区别:(1)load 加载方式当使用load方法来得到一个对象时,此时hibernate会使用延迟加载机制来加载这个对象,即:当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其他属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。
(2)get加载方式相对于load的延迟加载方式,get就直接的多,我们使用session.get()方法来得到一对象时,不管我们适不适用这个对象,此时多会发出sql语句去从数据库中查询出来。
(3)get和load使用时的一些问题:get:如果使用get方式来加载对象,当我们试图得到一个id不存在的对象,此时会报NullPointException的异常:这是因为通过get方式我们会去数据库中查询出该对象,但是这个id值不存在,所以user对象时null,所以也就会报NullPointException的异常了。
load:如果使用load方式来加载对象,当我们试图得到一个id不存在的对象时,会报ObjectNotFoundException异常。
原因是使用load时,此时的User对象是一个代理对象,仅仅保存了当前的这个id值,我们试图获得该对象的其他属性时,这个属性其实是不存在的,所以就会报ObjectNotFoundExceptionLazyInitializationException这种异常,就知道是使用了load的方式延迟加载一个对象了,解决这个的方法有两种,一种是将load改成get的方式来得到该对象,另一种是在表示层来开启我们的session和关闭session。
<4>hibernate save()和persist()区别:使用save() 方法保存持久化对象时,该方法返回该持久化对象的标识属性值(即对应记录的主键值);但使用persist() 方法来保存持久化对象时,该方法没有任何返回值。
因为save() 方法需要立即返回持久化对象的标识属性,所以程序执行save() 会立即将持久化对象对应的数据插入数据库;而persist() 则保证当它在一个事物外部被调用时,并不立即转换成insert 语句,这个功能是很有用的,尤其当我们封装一个长会话流程的时候,persist() 方法就显得尤为重要了。
<5>hibernate 的saveAndUpdate方法:save()方法很显然是执行保存操作的,如果是对一个新的刚new出来的对象进行保存,自然要使用这个方法了,数据库中没有这个对象。
update()如果是对一个已经存在的托管对象进行更新那么肯定是要使用update()方法了,数据中有这个对象。
saveOrUpdate()这个方法是更新或者插入,有主键就执行更新,如果没有主键就执行插入。
当主键是自己分配的(assigned)就不要用此方法来保存了。
那么,saveOrUpdate()方法如何判断一个对象处于临时状态还是游离状态呢?如果满足以下情况之一,Hibernate就把它作为临时对象。
Java对象的OID取值为null。
Java对象具有version属性并且取值为null。