【Java EE 學習 53】【Spring學習第五天】【Spring整合Hibernate】【Spring整合Hibernate、Struts2】【問題:整合hibernate以後事務不能回滾】

1、Spring整合Hibernatejava

  1.若是一個DAO 類繼承了HibernateDaoSupport,只須要在spring配置文件中注入SessionFactory就能夠了;若是一個DAO類沒有繼承HibernateDaoSupport,須要有一個HibernateTemplate的屬性,而且在配置文件中進行注入。注意,以前使用的是JdbcDaoSupport和JdbcTemplate,傳遞的是DataSource,如今使用的是HibernateDaoSupport和HibernateTemplate,傳遞的是SessionFactory。mysql

  2.整合Spring整合Hibernate示例。git

    (1)hibernate.cfg.xml配置文件程序員

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4         "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 5 <hibernate-configuration>
 6 <session-factory>
 7     <property name="connection.driver_class">
 8         com.mysql.jdbc.Driver
 9     </property>
10     <property name="connection.username">root</property>
11     <property name="connection.password">5a6f38</property>
12     <property name="connection.url">
13         jdbc:mysql://localhost:3306/test
14     </property>
15     <property name="show_sql">true</property>
16     <property name="hbm2ddl.auto">update</property>
17     <property name="dialect">
18         org.hibernate.dialect.MySQLDialect
19     </property>
20     <property name="javax.persistence.validation.mode">none</property>
21     <mapping resource="com/kdyzm/spring/hibernate/xml/Course.hbm.xml" />
22 </session-factory>
23 </hibernate-configuration>
hibernate.cfg.xml

    (2)幾個類github

 1 package com.kdyzm.spring.hibernate.xml;
 2 
 3 import java.io.Serializable;
 4 
 5 /*
 6  * 課程類
 7  */
 8 public class Course implements Serializable{
 9     private static final long serialVersionUID = 3765276226357461359L;
10     private Long cid;
11     private String cname;
12     
13     public Course() {
14     }
15     @Override
16     public String toString() {
17         return "Course [cid=" + cid + ", cname=" + cname + "]";
18     }
19     public Long getCid() {
20         return cid;
21     }
22     public void setCid(Long cid) {
23         this.cid = cid;
24     }
25     public String getCname() {
26         return cname;
27     }
28     public void setCname(String cname) {
29         this.cname = cname;
30     }
31 }
com.kdyzm.spring.hibernate.xml.Course
1 package com.kdyzm.spring.hibernate.xml;
2 
3 public interface CourseDao {
4     public Course getCourse(Long cid);
5     public Course updateCourse(Course course);
6     public Course deleteCourse(Course course);
7     public Course addCourse(Course course);
8 }
com.kdyzm.spring.hibernate.xml.CourseDao

    一個很是重要的類:com.kdyzm.spring.hibernate.xml.CourseDaoImplweb

 1 package com.kdyzm.spring.hibernate.xml;
 2 
 3 import org.springframework.orm.hibernate3.HibernateTemplate;
 4 
 5 public class CourseDaoImpl implements CourseDao{
 6     //這裏使用HibernateTemplate,而不是使用JdbcTemplate
 7     private HibernateTemplate hibernateTemplate;
 8     public HibernateTemplate getHibernateTemplate() {
 9         return hibernateTemplate;
10     }
11 
12     public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
13         this.hibernateTemplate = hibernateTemplate;
14     }
15 
16     @Override
17     public Course getCourse(Long cid) {
18         return (Course) this.getHibernateTemplate().get(Course.class, cid);
19     }
20 
21     @Override
22     public Course updateCourse(Course course) {
23         this.getHibernateTemplate().update(course);
24         return course;
25     }
26 
27     @Override
28     public Course deleteCourse(Course course) {
29         this.getHibernateTemplate().delete(course);
30         return course;
31     }
32 
33     @Override
34     public Course addCourse(Course course) {
35         this.getHibernateTemplate().saveOrUpdate(course);
36         return course;
37     }
38     
39 }

    這裏使用HibernateTemplate做爲成員變量,也能夠繼承HibernateDaoSupport類,效果是相同的。spring

1 package com.kdyzm.spring.hibernate.xml;
2 
3 public interface CourseService {
4     public Course getCourse(Long cid);
5     public Course updateCourse(Course course);
6     public Course deleteCourse(Course course);
7     public Course addCourse(Course course);
8 }
com.kdyzm.spring.hibernate.CourseService
 1 package com.kdyzm.spring.hibernate.xml;
 2 
 3 public class CourseServiceImpl implements CourseService{
 4     private CourseDao courseDao;
 5     
 6     public CourseDao getCourseDao() {
 7         return courseDao;
 8     }
 9 
10     public void setCourseDao(CourseDao courseDao) {
11         this.courseDao = courseDao;
12     }
13 
14     @Override
15     public Course getCourse(Long cid) {
16         return courseDao.getCourse(cid);
17     }
18 
19     @Override
20     public Course updateCourse(Course course) {
21         return courseDao.updateCourse(course);
22     }
23 
24     @Override
25     public Course deleteCourse(Course course) {
26         return courseDao.deleteCourse(course);
27     }
28 
29     @Override
30     public Course addCourse(Course course) {
31         return courseDao.addCourse(course);
32     }
33 
34 }
com.kdyzm.spring.hibernate.xml.CourseServiceImpl

    最後:測試代碼sql

 1 ApplicationContext context=new ClassPathXmlApplicationContext("com/kdyzm/spring/hibernate/xml/applicationContext.xml");
 2 CourseService courseService=(CourseService) context.getBean("courseService");
 3 Course course = new Course();
 4 //        course.setCid(11L);
 5 course.setCname("趙日天");
 6 courseService.addCourse(course);
 7 course =new Course();
 8 course.setCname("王大錘");
 9         //經過/0的異常測試事務回滾!
10 //        int a=1/0;
11 courseService.addCourse(course);

    運行結果:數據庫

    

    (3)com/kdyzm/spring/hibernate/xml/applicationContext.xml配置文件express

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:aop="http://www.springframework.org/schema/aop"
 6     xmlns:tx="http://www.springframework.org/schema/tx"
 7     
 8     xsi:schemaLocation="
 9            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
10            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
11            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
12            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
13            ">
14     <!-- 將hibernate.cfg.xml配置文件導入進來 -->
15     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
16         <property name="configLocation">
17             <value>classpath:hibernate.cfg.xml</value>
18         </property>
19     </bean>
20     
21     <!-- 程序員作的事情 -->
22     <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
23         <property name="sessionFactory" ref="sessionFactory"></property>
24     </bean>
25     <bean id="courseDao" class="com.kdyzm.spring.hibernate.xml.CourseDaoImpl">
26         <property name="hibernateTemplate" ref="hibernateTemplate"></property>
27     </bean>
28     
29     <bean id="courseService" class="com.kdyzm.spring.hibernate.xml.CourseServiceImpl">
30         <property name="courseDao">
31             <ref bean="courseDao"/>
32         </property>
33     </bean>
34     
35     <!-- Spring容器作的事情 -->
36     <!-- 定義事務管理器 -->
37     <bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
38         <property name="sessionFactory" ref="sessionFactory"></property>
39     </bean>
40     <!-- 哪些通知須要開啓事務模板 -->
41     <tx:advice id="advice" transaction-manager="hibernateTransactionManager">
42         <tx:attributes>
43             <tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
44         </tx:attributes>
45     </tx:advice>
46     <!-- 配置切面表達式和通知 -->
47     <aop:config>
48         <aop:pointcut expression="execution(* com.kdyzm.spring.hibernate.xml.*ServiceImpl.*(..))" id="perform"/>
49         <aop:advisor advice-ref="advice" pointcut-ref="perform"/>
50     </aop:config>
51 </beans>

  3.總結和分析

    (1)和使用JDBC的流程基本上是相同的,須要在配置文件中注入SessionFactory對象,注入HibernateTemplate對象。

    (2)以上的程序事務回滾沒有實現!!!!緣由不明

2、Spring整合Hibernate,使用註解的形式。

  1.在配置文件中使用spring的自動掃描機制。

<context:component-scan base-package="com.kdyzm.spring.hibernate.xml"></context:component-scan>

  2.在配置文件中引入註解解析器(須要指定事務管理器)

<tx:annotation-driven transaction-manager="hibernateTransactionManager"/>

  3.在service層經過@Transaction進行註解。

 3、Struts2自定義結果集

  1.struts-default.xml文件中定義了一些結果集類型。

 1 <result-types>
 2             <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
 3             <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
 4             <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/>
 5             <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
 6             <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/>
 7             <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
 8             <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
 9             <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/>
10             <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
11             <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
12             <result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" />
13         </result-types>
struts-default.xml配置文件中對結果集類型的定義

  2.咱們能夠經過實現Result接口或者繼承StrutsResultSupport類本身定義結果集類型

    * 若是咱們不須要跳轉頁面(使用了Ajax),則實現Result接口

      * 若是咱們須要在業務邏輯處理完畢以後進行頁面的跳轉(重定向或者轉發),則繼承StrutsResultSupport類。

  3.自定義結果集小案例

    (1)自定義結果集類型com.kdyzm.struts2.myresult.MyResult.java,這裏繼承了StrutsResultSupport類,這裏的代碼模仿了DispatcherResult類中的寫法。

       自定義結果集類型中的核心寫法已經重點標註。

 1 package com.kdyzm.struts2.myresult;
 2 
 3 import javax.servlet.RequestDispatcher;
 4 import javax.servlet.http.HttpServletRequest;
 5 import javax.servlet.http.HttpServletResponse;
 6 
 7 import org.apache.struts2.ServletActionContext;
 8 import org.apache.struts2.dispatcher.StrutsResultSupport;
 9 
10 import com.opensymphony.xwork2.ActionInvocation;
11 
12 public class MyResult extends StrutsResultSupport{
13     private static final long serialVersionUID = 8851051594485015779L;
14 
15     @Override
16     protected void doExecute(String finalLocation, ActionInvocation invocation)
17             throws Exception {
18         System.out.println("執行了自定義的 結果集類型!");
19         HttpServletRequest request=ServletActionContext.getRequest(); 20 HttpServletResponse response = ServletActionContext.getResponse(); 21 RequestDispatcher requestDispatcher = request.getRequestDispatcher(finalLocation); 22  requestDispatcher.forward(request, response); 23     }
24 }

    (2)測試Action:com.kdyzm.struts2.myresult.MyResultAction.java

 1 package com.kdyzm.struts2.myresult;
 2 
 3 import com.opensymphony.xwork2.ActionSupport;
 4 
 5 public class MyResultAction extends ActionSupport {
 6     private static final long serialVersionUID = -6710770364035530645L;
 7 
 8     @Override
 9     public String execute() throws Exception {
10         return super.execute();
11     }
12     
13     public String add() throws Exception{
14         return "myresult";
15     }
16 }

    (3)局部配置文件com.kdyzm.strus2.myresult.myResult_struts.xml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="myResult" namespace="/myResultNamespace" extends="struts-default">
        <!-- 自定義結果集類型 -->
        <result-types>
            <result-type name="myResult" class="com.kdyzm.struts2.myresult.MyResult"></result-type>
        </result-types>
        <action method="add" name="myResultAction" class="com.kdyzm.struts2.myresult.MyResultAction">
            <result name="myresult" type="myResult">
                <param name="location">
                    /main/index.jsp
                </param>
            </result>
        </action>
    </package>
</struts>

    (4)classpath:struts.xml

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5     <!-- namespace必定要加上/,不然通常會報錯! -->
 6 <struts>
 7     <package name="kdyzm" extends="struts-default" namespace="/kdyzm_namespace">
 8         <action name="helloAction" class="com.kdyzm.struts2.test.HelloWorldAction" method="execute">
 9             <result name="kdyzm_result">
10                 /main/index.jsp
11             </result>
12         </action>
13     </package>
14 <include file="com/kdyzm/struts2/myresult/myResult_struts.xml"></include></struts>
struts.xml

    (5)測試Jsp

<a href="${pageContext.servletContext.contextPath}/myResultNamespace/myResultAction.action">
            測試自定義結果集
</a>

    (6)跳轉到/main/index.jsp,顯示出

      

 

 4、SSH整合

  1.整合的第一步:導入jar包,在/WEB-INF/lib文件夾下,按照功能劃分爲幾個文件夾,分別存放不一樣類型的jar包。

    * common:存放公共包

    * db:存放數據庫驅動包

    * hibernate:存放hiberante相關包

    * junit:存放單元測試相關包

    * spring:存放spring相關包

    * struts2:存放struts2相關包

    儘量的將jar包關聯上源代碼,便於代碼追蹤和書寫。

  2.建立三個項目資源文件夾和對應的包

    (1)src:存放源代碼

      * dao

      * dao.impl

      * service:

      * service.impl

      * struts.action

      * domain

    (2) config:存放配置文件

      * hibernate

        * hibernate.cfg.xml

      * spring

        * applicationContext-db.xml

        * applicationContext-person.xml

        * applicationContext.xml

      * struts2

        struts-user.xml

      struts.xml

    (3)test:單元測試

  3.SSH整合的jar包、關鍵類文件和配置文件

    (1)Spring和Hibernate的整合過程見前面的筆記。

    (2)關鍵的就是Spring和Struts2的整合

    (3)Spring和Struts2整合須要一個關鍵的jar包:struts-spring-plugin-x.x.x.jar,該jar包能夠在struts2項目中的lib文件夾中找到。

    (4)在struts-spring-plugin.x.x.x.jar包中有一個很是重要的配置文件:struts-plugin.xml配置文件,該配置文件中的配置會覆蓋掉struts-default.xml中的配置。

    (5)須要在struts.xml配置文件中進行以下配置:

<constant name="struts.objectFactory" value="spring"></constant>

      進行這樣的配置以前必須導入struts-spring-plugin.x.x.x.jar包。

      可以這樣配置的依據是該jar包中的struts-plugin.xml配置文件中的配置:

<bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />

    (6)怎樣將Spring容器的初始化和Web服務器綁定在一塊兒,使得服務器啓動以後Spring容器就已經初始化成功。

      解決方案就是在web.xml配置文件中添加一項監聽器的配置。

1 <listener>
2         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
3     </listener>
4     <context-param>
5         <param-name>contextConfigLocation</param-name>
6         <param-value>classpath:spring/applicationContext.xml</param-value>
7     </context-param>

      其中param-name標籤中的內容contextConfigLocation是固定字符串,不能更改。contextConfigLocation字符串的出處:

      

     (7)applicationContext.xml配置文件默認位置爲:/WEB-INF/applicationContext.xml,經過XmlWebApplicationContext.xml配置文件就能夠看出來。

      

       因此,若是applicationContext.xml在/WEB-INF目錄下的話,就不須要再配置

<context-param>
         <param-name>contextConfigLocation</param-name>
          <param-value>classpath:spring/applicationContext.xml</param-value>
      </context-param>

      了。

5、整合模板代碼

  https://github.com/kdyzm/day53_ssh_merge

相關文章
相關標籤/搜索