现在的位置: 首页 > 综合 > 正文

spring整合Hibernate

2018年05月19日 ⁄ 综合 ⁄ 共 9718字 ⁄ 字号 评论关闭

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;
//	注入SessionFactory
	public 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 对分页的支持很好,只能使用回调调用session
		return (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.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://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.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/struts2
jdbc.username=root
jdbc.password=1234
dialect=org.hibernate.dialect.MySQLDialect
ShowSql=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.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
			http://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就算配置完成了。

【上篇】
【下篇】

抱歉!评论已关闭.