zoukankan      html  css  js  c++  java
  • 1、Struts2和Hibernate的简单整合(带Session的管理方式)

    1、关于数据库:是部门和员工的关系

        关于entity和xx.hbm.xml的实现

        Dept.class 

    package cn.itcast.entity;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Dept {
    
        private int deptId;
        private String deptName;
        // 【一对多】 部门对应的多个员工
        private Set<Employee> emps = new HashSet<Employee>();
        
        public Dept(int deptId, String deptName) {
            super();
            this.deptId = deptId;
            this.deptName = deptName;
        }
        public Dept() {
            super();
        }
        public int getDeptId() {
            return deptId;
        }
        public void setDeptId(int deptId) {
            this.deptId = deptId;
        }
        public String getDeptName() {
            return deptName;
        }
        public void setDeptName(String deptName) {
            this.deptName = deptName;
        }
        public Set<Employee> getEmps() {
            return emps;
        }
        public void setEmps(Set<Employee> emps) {
            this.emps = emps;
        }
        @Override
        public String toString() {
            return "Dept [deptId=" + deptId + ", deptName=" + deptName + "]";
        }
        
        
        
    
    }

      Dept.hbm.xml    

      

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="cn.itcast.entity">
        
        <class name="Dept" table="t_dept" >
            <id name="deptId">
                <generator class="native"></generator>
            </id>    
            <property name="deptName" length="20"></property>
            
             <set name="emps">
                  <key column="dept_id"></key>
                  <one-to-many class="Employee"/>
             </set>
        </class>
        
    </hibernate-mapping>

    Employee.class

    package cn.itcast.entity;
    
    public class Employee {
    
        private int empId;
        private String empName;
        private double salary;
        // 【多对一】员工与部门
        private Dept dept;;
        
        
        public int getEmpId() {
            return empId;
        }
        public void setEmpId(int empId) {
            this.empId = empId;
        }
        public String getEmpName() {
            return empName;
        }
        public void setEmpName(String empName) {
            this.empName = empName;
        }
        public double getSalary() {
            return salary;
        }
        public void setSalary(double salary) {
            this.salary = salary;
        }
        public Dept getDept() {
            return dept;
        }
        public void setDept(Dept dept) {
            this.dept = dept;
        }
        
        
    }

    Employee.hbm.xml

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
    <hibernate-mapping package="cn.itcast.entity">
        
        <class name="Employee" table="t_employee">
            <id name="empId">
                <generator class="native"></generator>
            </id>    
            <property name="empName" length="20"></property>
            <property name="salary" type="double"></property>
            
            <many-to-one name="dept" column="dept_id" class="Dept"></many-to-one>
             
        </class>
        
    
    </hibernate-mapping>

    2、关于dao的实现

        DeptDao.java

    package cn.itcast.dao;
    
    import cn.itcast.entity.Dept;
    import cn.itcast.utils.HibernateUtils;
    
    public class DeptDao {
    
        /**
         * 主键查询
         */
        public Dept findById(int id){
            // 获取session, 执行操作
            return (Dept) HibernateUtils.getSession().get(Dept.class, id);
        }
    }

    3、关于serrvice的实现

         DeptService.java

         

    package cn.itcast.service;
    
    import cn.itcast.dao.DeptDao;
    import cn.itcast.entity.Dept;
    import cn.itcast.utils.HibernateUtils;
    
    public class DeptService {
    
        // 调用的dao
        private DeptDao deptDao  = new DeptDao();
        
        public Dept findById(int id){
            return deptDao.findById(id);
        }
    }

    4、关于Action的实现

      DeptAction.java

      

    package cn.itcast.action;
    
    import cn.itcast.entity.Dept;
    import cn.itcast.service.DeptService;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class DeptAction extends ActionSupport{
        
        // Service
        private DeptService deptService = new DeptService();
        
        // 默认处理方法
        public String execute() {
            // 主键查询(模拟数据)
            Dept dept = deptService.findById(12);
            // 保存
            ActionContext.getContext().getContextMap().put("dept", dept);
            return SUCCESS;
        }
    }

    4、session拦截器的实现

       SessionInterceptor.java

       

    package cn.itcast.interceptor;
    
    import org.hibernate.Session;
    
    import cn.itcast.utils.HibernateUtils;
    
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    
    /**
     * Session管理拦截器:
     *       当访问action的时候,创建session; 
     *      action ---> service  --> dao 【获取的是这里创建的session】
     * @author Jie.Yuan
     *
     */
    public class SessionInterceptor extends AbstractInterceptor {
    
        @Override
        public String intercept(ActionInvocation invocation) throws Exception {
            
            try {
                // 1. 先创建Session
                Session session = HibernateUtils.getSession();
                // 2. 开启事务
                session.beginTransaction();
                
                // 3. 执行Action
                String result = invocation.invoke();
                
                // 4. 提交事务
                session.getTransaction().commit();  // 不需要关闭session
                
                // 返回结果视图
                return result;
            } catch (Exception e) {
                e.printStackTrace();
                return "error";
            }
        }
    
    }

    5、关于HibernateUtils的实现

    package cn.itcast.utils;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtils {
    
        // 初始化SessionFactory
        private static SessionFactory sf;
        static {
            sf = new Configuration().configure().buildSessionFactory();
        }
        
        // 创建(获取)Session
        public static Session getSession() {
            // 线程的方式创建session,必须要配置
            // 可以不用关闭,会自动关。
            return sf.getCurrentSession();
        }
    }

    6、关于hibernate.cfg.xml文件配置

    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <!-- 通常,一个session-factory节点代表一个数据库 -->
        <session-factory>
        
            <!-- 1. 数据库连接配置 -->
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">root</property>
            <!-- 
                数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql
             -->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
            
            <!-- 2. 其他相关配置 -->
            <!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
            <property name="hibernate.show_sql">true</property>
            <!-- 2.2 格式化sql
            <property name="hibernate.format_sql">true</property>  -->
            <!-- 2.3 自动建表  -->
            <property name="hibernate.hbm2ddl.auto">update</property>
            
            <!-- 配置session的创建方式:线程方式创建session对象 -->
            <property name="hibernate.current_session_context_class">thread</property>
            
            <!--****************** 【连接池配置】****************** -->
            <!-- 配置连接驱动管理类 -->
            <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
            <!-- 配置连接池参数信息 -->
            <property name="hibernate.c3p0.min_size">2</property>
            <property name="hibernate.c3p0.max_size">4</property>
            <property name="hibernate.c3p0.timeout">5000</property>
            <property name="hibernate.c3p0.max_statements">10</property>
            <property name="hibernate.c3p0.idle_test_period">30000</property>
            <property name="hibernate.c3p0.acquire_increment">2</property>
            
            <!--****************** 【二级缓存配置】****************** -->
            <!-- a.  开启二级缓存 -->
            <property name="hibernate.cache.use_second_level_cache">true</property>
            <!-- b. 指定使用哪一个缓存框架(默认提供的) -->
            <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
            <!-- 开启查询缓存 -->
            <property name="hibernate.cache.use_query_cache">true</property>
            <!-- c. 指定哪一些类,需要加入二级缓存 -->
            <class-cache usage="read-write" class="cn.itcast.b_second_cache.Dept"/>
            <class-cache usage="read-only" class="cn.itcast.b_second_cache.Employee"/>
            <!-- 集合缓存[集合缓存的元素对象,也加加入二级缓存] -->
            <collection-cache usage="read-write" collection="cn.itcast.b_second_cache.Dept.emps"/>
            
            
            
            <!-- 3. 加载所有映射 
            <mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>
            -->
        </session-factory>
    </hibernate-configuration>
    
    
    <!-- 开启查询缓存 -->
            <property name="hibernate.cache.use_query_cache">true</property>
            <!-- c. 指定哪一些类,需要加入二级缓存 -->
            <class-cache usage="read-write" class="com.baowei.entity.Group" />
            <class-cache usage="read-only" class="com.baowei.entity.User" />
            <!-- 集合缓存[集合缓存的元素对象,也加加入二级缓存] -->
            <collection-cache usage="read-write"
                collection="com.baowei.entity.Group.users" />

    7、关于struts.xml文件的配置

    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <session-factory>
            <!-- 数据库连接信息 -->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>    
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>    
            <property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>    
            <property name="hibernate.connection.username">root</property>    
            <property name="hibernate.connection.password">root</property>    
            <property name="hibernate.show_sql">true</property>
            <property name="hibernate.hbm2ddl.auto">update</property>
            <!-- session创建方式 -->
            <property name="hibernate.current_session_context_class">thread</property>
            
            <!-- 加载映射 -->
            <mapping resource="cn/itcast/entity/Dept.hbm.xml"/>
            <mapping resource="cn/itcast/entity/Employee.hbm.xml"/>
            
        </session-factory>
    </hibernate-configuration>
  • 相关阅读:
    POJ 3660 Cow Contest (floyd求联通关系)
    POJ 3660 Cow Contest (最短路dijkstra)
    POJ 1860 Currency Exchange (bellman-ford判负环)
    POJ 3268 Silver Cow Party (最短路dijkstra)
    POJ 1679 The Unique MST (最小生成树)
    POJ 3026 Borg Maze (最小生成树)
    HDU 4891 The Great Pan (模拟)
    HDU 4950 Monster (水题)
    URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
    URAL 2037 Richness of binary words (回文子串,找规律)
  • 原文地址:https://www.cnblogs.com/zhangbaowei/p/4883553.html
Copyright © 2011-2022 走看看