spring整合Hibernate

来源:互联网 发布:java数组倒置 编辑:程序博客网 时间:2024/05/22 00:44

spring整合Hibernate需要导入spring和hibernate必要的jar包,如果有相同的jar包,去掉旧的,保留新的和大的jar包。

需要的配置文件有spring的applicationContext.xml,hibernate的hibernate.cfg.xml,还有po类的Xxx.hbm.xml

下面以Emp类为例:

import java.util.Date;/** * Emp generated by MyEclipse Persistence Tools */public class Emp  implements java.io.Serializable {     private Integer empno;     private Dept dept;     private String ename;     private String job;     private Integer mgr;     private Date hiredate;     private Integer sal;     private Integer comm;    // Constructors    /** default constructor */    public Emp() {    }        public Emp(Integer empno, String ename, String job, Integer sal) {super();this.empno = empno;this.ename = ename;this.job = job;this.sal = sal;}/** full constructor */    public Emp(Dept dept, String ename, String job, Integer mgr, Date hiredate, Integer sal, Integer comm) {        this.dept = dept;        this.ename = ename;        this.job = job;        this.mgr = mgr;        this.hiredate = hiredate;        this.sal = sal;        this.comm = comm;    }      // Property accessors    public Integer getEmpno() {        return this.empno;    }        public void setEmpno(Integer empno) {        this.empno = empno;    }    public Dept getDept() {        return this.dept;    }        public void setDept(Dept dept) {        this.dept = dept;    }    public String getEname() {        return this.ename;    }        public void setEname(String ename) {        this.ename = ename;    }    public String getJob() {        return this.job;    }        public void setJob(String job) {        this.job = job;    }    public Integer getMgr() {        return this.mgr;    }        public void setMgr(Integer mgr) {        this.mgr = mgr;    }    public Date getHiredate() {        return this.hiredate;    }        public void setHiredate(Date hiredate) {        this.hiredate = hiredate;    }    public Integer getSal() {        return this.sal;    }        public void setSal(Integer sal) {        this.sal = sal;    }    public Integer getComm() {        return this.comm;    }        public void setComm(Integer comm) {        this.comm = comm;    }}

下面是Emp.hbm.xml配置文件内容:

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!--     Mapping file autogenerated by MyEclipse Persistence Tools--><hibernate-mapping package="com.xxx.po">    <class name="Emp" table="emp" catalog="struts2">        <id name="empno" type="java.lang.Integer">            <column name="EMPNO" />            <generator class="native"></generator>        </id>        <many-to-one name="dept" class="Dept" fetch="select">            <column name="DEPTNO" />        </many-to-one>        <property name="ename" type="java.lang.String">            <column name="ENAME" length="10" />        </property>        <property name="job" type="java.lang.String">            <column name="JOB" length="9" />        </property>        <property name="mgr" type="java.lang.Integer">            <column name="MGR" />        </property>        <property name="hiredate" type="java.util.Date">            <column name="HIREDATE" length="10" />        </property>        <property name="sal" type="java.lang.Integer">            <column name="SAL" />        </property>        <property name="comm" type="java.lang.Integer">            <column name="COMM" />        </property>    </class></hibernate-mapping>

下面是hibernate的配置文件hibernate.cfg.xml内容:

<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><property name="myeclipse.connection.profile">test</property><property name="connection.url">jdbc:mysql://localhost:3306/struts2</property><property name="connection.username">root</property><property name="connection.password">1234</property><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="dialect">org.hibernate.dialect.MySQLDialect</property><property name="show_sql">true</property><mapping resource="com/xxx/po/Dept.hbm.xml" /><mapping resource="com/xxx/po/Emp.hbm.xml" /></session-factory></hibernate-configuration>

下面是一个dao的实现类,里面简单的写了几个方法:spring也提供了一个工具类来操作数据,就是HibernateTemplate,要使用此类,需要注入一个SessionFactory

import java.sql.SQLException;import java.util.List;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.springframework.orm.hibernate3.HibernateCallback;import org.springframework.orm.hibernate3.HibernateTemplate;public class EmpDaoImpl implements IEmpDao {private HibernateTemplate hibernateTemplate;//注入SessionFactorypublic void setSessionFactory(SessionFactory sessionFactory){hibernateTemplate = new HibernateTemplate(sessionFactory);}// 根据empno删除emp数据public void deleteById(int empno) {Emp emp = new Emp();emp.setEmpno(7934);hibernateTemplate.delete(emp);}public long findCount() {String hql = "select count(empno) from Emp";return (Long) hibernateTemplate.find(hql).get(0);}// 根据id查询对象public Emp findEmpById(int empno) {return (Emp) hibernateTemplate.get(Emp.class, empno);}public List<Emp> findEmps() {// 要求只查询出5个属性的,使用hql的构造方法查询String hql = "select new com.xxx.po.Emp(empno,ename,job,sal) from Emp ";return hibernateTemplate.find(hql);}public List<Emp> findPage(final int firstResult, final int maxResult) {//hibernate 对分页的支持很好,只能使用回调调用sessionreturn (List<Emp>) hibernateTemplate.execute(new HibernateCallback(){public Object doInHibernate(Session session) throws HibernateException, SQLException {String hql = "from Emp";return session.createQuery(hql).setFirstResult(firstResult).setMaxResults(maxResult).list();}});}}

最后是配置spring配置文件applicationContext.xml,这种方式是直接读取了hibernate.cfg.xml配置文件

<?xml version="1.0" encoding="UTF-8"?><!--  - Application context definition for JPetStore's business layer.  - Contains bean references to the transaction manager and to the DAOs in  - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").  --><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"><!-- 配置SessionFactory :1)读取hibernate.cfg.xml文件--><bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="configLocation"  value="classpath:hibernate.cfg.xml"></property></bean><!-- 1 指定事务管理器 --><bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"></property></bean><!-- 2 配置事务的特性(事务的传播特性和事务的隔离级别) --><tx:advice id="mAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="find*" propagation="NOT_SUPPORTED" isolation="READ_COMMITTED" read-only="true"/><tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED"/></tx:attributes></tx:advice><!-- 3 配置Aop:事务配置service层(此处没有service就配置到了dao层) --><aop:config><aop:pointcut id="curd" expression="execution (* com.xxx.dao..*.*(..))"/><aop:advisor advice-ref="mAdvice" pointcut-ref="curd"/></aop:config><bean id="empDao" class="com.xxx.dao.impl.EmpDaoImpl"><property name="sessionFactory" ref="sessionFactory"></property></bean></beans>

我们也可以丢弃掉hibernate.cfg.xml文件,把这些信息配置到.properties文件中,然后在spring配置文件中读取,这样的好处是,项目完结后,源代码一般不给,就可以给这个.properties配置文件,用户可以根据需要自行修改里面的内容

hibernate用的c3p0连接池,所以我这里就把配置文件名称叫做c3p0.properties,内容为:

jdbc.driverClass=com.mysql.jdbc.Driverjdbc.url=jdbc\:mysql\://localhost\:3306/struts2jdbc.username=rootjdbc.password=1234dialect=org.hibernate.dialect.MySQLDialectShowSql=true

spring配置文件就这样配置:

<?xml version="1.0" encoding="UTF-8"?><!--  - Application context definition for JPetStore's business layer.  - Contains bean references to the transaction manager and to the DAOs in  - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").  --><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"><!-- 读取C3P0.properties文件 --><context:property-placeholder location="classpath:c3p0.properties"/><!-- 配置SessionFactory :3参数:连接池  hibernate自身特性 注册映射文件连接池(C3p0)可以在外界修改参数C3P0核心类:ComboPooledDataSource--><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"><property name="driverClass" value="${jdbc.driverClass}"></property><property name="jdbcUrl" value="${jdbc.url}"></property><property name="user" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean><bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="dataSource" ref="dataSource"></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">${dialect}</prop><prop key="hibernate.show_sql">${ShowSql}</prop></props></property><property name="mappingResources"><list><value>com/xxx/po/Dept.hbm.xml</value><value>com/xxx/po/Emp.hbm.xml</value></list></property></bean><!-- 1 指定事务管理器 --><bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"></property></bean><!-- 2 配置事务的特性(事务的传播特性和事务的隔离级别) --><tx:advice id="mAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="find*" propagation="NOT_SUPPORTED" isolation="READ_COMMITTED" read-only="true" /><tx:method name="*"propagation="REQUIRED"isolation="READ_COMMITTED"/></tx:attributes></tx:advice><!-- 3 配置Aop:事务配置service层 --><aop:config><aop:pointcut id="curd" expression="execution (* com.xxx.dao..*.*(..))"/><aop:advisor advice-ref="mAdvice" pointcut-ref="curd"/></aop:config><bean id="empDao" class="com.xxx.dao.impl.EmpDaoImpl"><property name="sessionFactory" ref="sessionFactory"></property></bean></beans>


自此,spring整合hibernate就算配置完成了。


原创粉丝点击