程序示例:

1、引入jar包

2、实体对象

Dept.java

package com.gqx.entity;

import java.util.HashSet;
import java.util.Set;

/*	异常 org.hibernate.InstantiationException: No default constructor for entity
	当查询的时候返回的实体类是一个对象实例,是hibernate动态通过反射生成的
	反射的Class.forName("className").newInstance();需要对应的类提供一个无参构造函数,
	出现这种问题是一般都是实体类有一个有参的构造 ,没有无参构造

	下面说一下有参构造 和无参构造
	1,每一个类在默认情况下,都会有一个无参数构造器!
	2,当声明了带参构造器,那么无参构造器就不存在了,需要无参构造器,就必须重新声明!
	3,构造器是不能够继承的
	4,在类构造器中,无论是有参数还是无参数构造器,默认情况下,首先会调用父类的无参构造器(一直到最上层的父类),
	这是因为要调用父类继承下来的方法必须要先初始化父类.
	5,需要在子类构造器中调用父类其它的构造器,可以显示声明*/

public class Dept {
	private int deptId;
	private String deptName;
	//一对多配置的集合,即一个部门对应多个员工
	private Set<Employee> emps=new HashSet<Employee>();

	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;
	}
}

Employee.java

package com.gqx.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;
	}
}

2、映射文件

<?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="com.gqx.entity">

	<class name="Dept"  table="t_dept2">
		<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>
<?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="com.gqx.entity">

	<class name="Employee"  table="t_employee2">
		<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>

3、主配置文件

<!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.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property>
		<property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;DataBaseName=Test</property>
		<property name="hibernate.connection.username">sa</property>
		<property name="hibernate.connection.password">123456</property>
		<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>
		<property name="hibernate.show_sql">true</property>
			<!-- 格式化sql语句
		<property name="hibernate.format_sql">true</property>-->
		<property name="hibernate.hbm2ddl.auto">update</property>

		<!-- session创建方式 -->
		<property name="hibernate.current_session_context_class">thread</property>

		<!-- 加载映射文件 -->
		<mapping resource="com/gqx/entity/Dept.hbm.xml"/>
		<mapping resource="com/gqx/entity/Employee.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

4、struts配置文件

<?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">

<!-- START SNIPPET: xworkSample -->
<struts>
	<package name="dept" extends="struts-default">
		<!-- 拦截器配置 -->
		<interceptors>
			<interceptor name="sessionInterceptor" class="com.gqx.interceptor.SessionInterceptor"></interceptor>
			<interceptor-stack name="myStack">
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="sessionInterceptor"></interceptor-ref>
			</interceptor-stack>
		</interceptors>

		<default-interceptor-ref name="myStack"></default-interceptor-ref>

		<!-- action配置 -->
		<action name="show" class="com.gqx.action.DeptAction">
			<result name="success">/index.jsp</result>
		</action>
	</package>
</struts>

<!-- END SNIPPET: xworkSample -->

5、工具包

package com.gqx.util;

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(){
		return sf.getCurrentSession();
	}
}

/**
 *  (1)、openSession 从字面上可以看得出来,是打开一个新的session对象,而且每次使用都是打开一个新的session,
 *  假如连续使用多次,则获得的session不是同一个对象,并且使用完需要调用close方法关闭session。
 *
 *  (2)、getCurrentSession 获取当前上下文一个session对象,当第一次使用此方法时,会自动产生一个session对象,
 *  并且连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一,
 *  简单而言,getCurrentSession 就是:如果有已经使用的,用旧的,如果没有,建新的。
 *
 *  (3)、对于getCurrentSession 来说,有以下一些特点:
 *  	1、事务提交会自动close,不需要像openSession一样自己调用close方法关闭session
 *  	2、上下文配置(即在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 分布式事务管理 (多数据库访问),
 * 		c).jta 由中间件提供(JBoss WebLogic 等, 但是tomcat 不支持)
 */

6、 Session管理拦截器

package com.gqx.interceptor;

import org.hibernate.Hibernate;
import org.hibernate.Session;

import com.gqx.util.HibernateUtils;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
 * Session管理拦截器
 * 当访问action时,创建session
 * action --> service --> dao 获取的是这里创建的session
 * @author 郭庆兴
 *
 */
public class SessionInterceptor extends AbstractInterceptor{

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		// TODO Auto-generated method stub
		try {
			//1、先创建Session
			Session session=HibernateUtils.getSession();
			session.beginTransaction();
			//2、执行action
			String result=invocation.invoke();	//一旦执行到这一句就会打印出sql语句

			//4、提交事物
			session.getTransaction().commit();	//不需要关闭session
			return result;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "error";
		}
	}

}

7、Dao包

package com.gqx.dao.deptDao;

import com.gqx.entity.Dept;
import com.gqx.util.HibernateUtils;

public class DeptDao {
	//主键查询
	public Dept findById(int id){
		return (Dept)HibernateUtils.getSession().get(Dept.class, id);
	}
}

8、Action类

package com.gqx.action;

import com.gqx.entity.Dept;
import com.gqx.service.DeptService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class DeptAction extends ActionSupport{
	//逻辑业务类
	DeptService deptService=new DeptService();

	public String execute() throws Exception {
		Dept dept =deptService.findById(2);
		//保存
		ActionContext.getContext().put("dept", dept);
		return SUCCESS;
	}
}

9、页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'index.jsp' starting page</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">

  </head>

  <body>
    	<center><h2>部门:<s:property value="#request.dept.deptName"/></h2></center>
    	<!-- 部门员工 懒加载数据-->
    	<table border="1" align="center">
    		<tr>
    			<td>员工编号</td>
    			<td>员工姓名</td>
    			<td>员工薪水</td>
    		</tr>
    		<s:if test="#request.dept.emps != null">
    			<s:iterator var="emp" value="#request.dept.emps">
    				<tr>
    					<td><s:property value="#emp.empId"/></td>
    					<td><s:property value="#emp.empName"/></td>
    					<td><s:property value="#emp.salary"/></td>
    				</tr>
    			</s:iterator>
    		</s:if>
    		<s:else>
    			<tr><td>没有员工信息!</td></tr>
    		</s:else>
    	</table>

  </body>
</html>

10、开启服务器,发布项目,访问http://localhost:8080/struts-hibernate/show,结果如图

struts和hibernate整合的更多相关文章

  1. Struts+Spring+Hibernate整合入门详解

    Java 5.0 Struts 2.0.9 Spring 2.0.6 Hibernate 3.2.4 作者:  Liu Liu 转载请注明出处 基本概念和典型实用例子. 一.基本概念       St ...

  2. Struts+Spring+Hibernate整合

    这段笔记三两年前写的,一直因为一些琐事,或者搞忘记了,没有发.今天偶然翻出了它,就和大家一起分享下吧. 1.导入jar包 Struts的jar包: Spring的jar包: Hibernate的jar ...

  3. Struts+Spring+Hibernate整合笔记一

    OpenSessionInview: 1.如果当前方法没有事物环境,则调用完毕getHibernate以后.session关闭: 说明:1如果测试dao层,没有事物环境 2如果测试service层,但 ...

  4. Struts+Spring+Hibernate、MVC、HTML、JSP

    javaWeb应用 JavaWeb使用的技术,比如SSH(Struts.Spring.Hibernate).MVC.HTML.JSP等等技术,利用这些技术开发的Web应用在政府项目中非常受欢迎. 先说 ...

  5. 轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)

    轻量级Java EE企业应用实战(第4版):Struts 2+Spring 4+Hibernate整合开发(含CD光盘1张)(国家级奖项获奖作品升级版,四版累计印刷27次发行量超10万册的轻量级Jav ...

  6. Java Web整合开发实战:基于Struts 2+Hibernate+Spring 目录

    第1篇 Java Web开发基础第1章 Web的工作机制( 教学视频:31分钟) 1.1 理解Web的概念 1.1.1 Web的定义 1.1.2 Web的三个核心标准 1.2 C/S与B/S两种软件体 ...

  7. Spring+Hibernate+Struts(SSH)框架整合

    SSH框架整合 前言:有人说,现在还是流行主流框架,SSM都出来很久了,更不要说SSH.我不以为然.现在许多公司所用的老项目还是ssh,如果改成流行框架,需要成本.比如金融IT这一块,数据库dao层还 ...

  8. Spring入门(四)— 整合Struts和Hibernate

    一.Spring整合Struts 1. 初步整合 只要在项目里面体现spring和 strut即可,不做任何的优化. struts 环境搭建 创建action public class UserAct ...

  9. Struts 2 + Hibernate + Spring 整合要点

    Struts 2 和 Spring 的功能有重合,因此有必要说明下,整合中分别使用了两种框架的哪些技术. Struts 2 使用功能点: 1.拦截器.一处是对非登录用户购物进行拦截,一处是对文件上传的 ...

随机推荐

  1. java基础-day25

    第02天 java基础加强 今日内容介绍 u Properties的基本操作 u 反射综合案例 u BeanUtils概述及使用 第1章   Properties的基本操作 1.1  Properti ...

  2. set_magic_quotes_runtime set_magic_quotes_gpc

    set_magic_quotes_runtime(0); 可以修改php.ini中 magic_quotes_runtime boolean的设置 当你的数据中有一些\"'这样的字符要写入到 ...

  3. codeforces 477D

    题意:给定一个长度<=5000的二进制字符串S,以及一个初始为0的n,有一下两种操作: 1. 输出n(n>=1并且为2进制形式输出) 2.n=n+1 每次选择一种操作.. 求:1.有多少方 ...

  4. centos rpm包下载地址

    这个是6.5的下载地址,其他版本可以退回目录找相应的版本 http://vault.centos.org/6.5/updates/x86_64/Packages/

  5. My first paper is now available online

    A two-grid discretization scheme of non-conforming finite elements for transmission eigenvalues

  6. Delphi中break,exit,abort跳出循环的比较

    http://www.delphitop.com/html/hanshu/104.html Delphi中break,exit,abort跳出循环的比较 exit: 退出函数体abort: 遇到异常, ...

  7. Android-Java-死锁

    死锁:程序不往下执行了,程序又没有结束,就一直卡在哪里: 在使用synchronized的时候要避免死锁,synchronized嵌套就可能会引发死锁,需要严格的检查代码,排除死锁发生的可能: 特意演 ...

  8. 关于能量场和力场弯曲空间的实验证明 EXPERIMENTAL PROOF ON THE BENDING SPACE OF ENERGY FIELD AND FORCE FIELD

    前文提到,F = ma, E = mc^2,并且等效是传递的,等效概念具有同属性.所以不止能量,力场也可以弯曲空间. 实验:某人被头顶上方的电站10几万伏的设备吸收,烧毁双臂. (虽然这个实验不应具有 ...

  9. .NET 中的 GAC

    GAC : ———> 全局程序集缓存 介绍GAC的好文章(怎么:生成SNK,给项目加强名称,加入到GAC,多个版本共存,介绍了不同的工具): http://www.makaidong.com/% ...

  10. .net图表之ECharts随笔01-最简单的使用步骤

    找了几种绘制图表的办法,后面选定了ECharts.下载链接如下,好像不同的ECharts有不同的用法,要下对. https://gitee.com/Tuky/SomeWebFrame/tree/mas ...