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>
  • 相关阅读:
    bash的shebang行
    Step By Step(Lua调用C函数)
    [Android问答] px、dp和sp,这些单位有什么区别?
    Android中Application类用法
    Android中SharedPreferences用法
    Android中SQLite用法
    SQLite应用实例
    Android中Parcelable接口用法
    iOS block 基本用法及代替代理
    Xcode插件
  • 原文地址:https://www.cnblogs.com/zhangbaowei/p/4883553.html
Copyright © 2011-2022 走看看