前往顾页
以后地位: 主页 > 收集编程 > Jsp实例教程 >

spring与hibernate整合问题概述

时候:2011-03-16 11:50来源:知行网www.zhixing123.cn 编辑:麦田守望者

Spring整合Hibernate的价值在于Spring为Hibernate增加了以下内容:
   * Session management:Spring为Hibernate的session供应了有效、容易和宁静的节制
   * Resource management:Spring节制Hibernate的SessionFactories,JDBC datasources及别的相关资本
   * Integrated transaction management:完整的事件办理
   * Exception wrapping:异常的包装

1. 操纵Spring IoC容器建立SessionFactory

可利用org.springframework.orm.hibernate3.LocalSessionFactoryBean建立SessionFactory实例, 共有以下二种体例:
1) 【最好计划】直接利用Hibernate建设文件hibernate.cfg.xml
  Hibernate建设文件hibernate.cfg.xml以下:

<?xml version='1.0' encoding='UTF-8'?>
<!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">
com.microsoft.sqlserver.jdbc.SQLServerDriver
</property>
<property name="connection.url">
jdbc:sqlserver://localhost:1433;databaseName=SSH
</property>
<property name="connection.username">sa</property>
<property name="connection.password"></property>
<property name="connection.driver_class">
com.microsoft.sqlserver.jdbc.SQLServerDriver
</property>
<property name="dialect">
org.hibernate.dialect.SQLServerDialect
</property>
<mapping resource="cn/qdqn/ssh/entity/UserInfo.hbm.xml" />
</session-factory>
</hibernate-configuration>
   Spring建设文件中SessionFactory初始化建设体例:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
</bean>

2) 在Spring建设文件中整合所有Hibernate建设参数

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName"
value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url"
value="jdbc:sqlserver://localhost:1433;databaseName=SSH"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource">
</property>
<property name="mappingResources">
<list>
<value>cn/qdqn/ssh/entity/UserInfo.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
<prop key="show_sql">true</prop>
</props>
</property>
</bean>
  重视:利用MyEclipse集成SSH时,org.apache.commons.dbcp.BasicDataSource地点的包 commons-dbcp-1.2.2.jar不会默许加载,别的还需加载commons-pool-1.4.jar,二者都可在Apache网站 commons项面前目今找到。不然运行法度会呈现以下异常:


java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Unknown Source)
at java.lang.Class.getConstructor0(Unknown Source)
at java.lang.Class.getDeclaredConstructor(Unknown Source)
……
2. Hibernate DAO开辟


1) 利用Hibernate原生API实现DAO
   A. 利用原生API实现DAO

 

public class UserInfoDAORaw implements IUserInfoDAO {
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public List findAll() {
return this.sessionFactory.getCurrentSession()
.createQuery("from UserInfo").list();
}
部分代码省略……
}
   B. 在applicationContext.xml建设原生DAO Bean 

<bean id="userInfoDAORaw" class="cn.qdqn.ssh.dao.UserInfoDAORaw">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
   C. 运行测试

ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
UserInfoDAORaw dao=(UserInfoDAORaw)ctx.getBean("userInfoDAORaw");
List<UserInfo> list=dao.findAll();
for(UserInfo info : list){
System.out.println(info.getUserName()+"-"+info.getUserPwd());
}
  结论:利用Hibernate原生API实现DAO可以做到Hibernate和Spring完整分离,错误谬误是无法操纵Spring封装Hibernate所供应的分外服从。


2)【最好计划】利用Spring框架所供应的HibernateDaoSupport类实现DAO
   A. 利用MyEclipse反向工程天生Spring 整合Hibernate 的DAO,该DAO继承自Spring的org.springframework.orm.hibernate3.support.HibernateDaoSupport 

public class UserInfoDAO extends HibernateDaoSupport {
private static final Log log = LogFactory.getLog(UserInfoDAO.class);
// property constants
public static final String USER_NAME = "userName";
public static final String USER_PWD = "userPwd";

public void save(UserInfo transientInstance) {
log.debug("saving UserInfo instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
部分代码省略……
}
   B. 在applicationContext.xml建设DAO Bean 

<bean id="userInfoDAO" class="cn.qdqn.ssh.dao.UserInfoDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
   C. 运行测试

ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
UserInfoDAORaw dao=(UserInfoDAORaw)ctx.getBean("userInfoDAO");
List<UserInfo> list=dao.findAll();
for(UserInfo info : list){
System.out.println(info.getUserName()+"-"+info.getUserPwd());
}
  重视:HibernateDaoSupport经由过程getHibernateTemplate()体例获得HibernateTemplate实例进 行保存、删除等操纵,但是HibernateTemplate默许不进行事件措置,而在Hibernate中这些操纵必须在事件下履行才气获得精确的结 果,是以必须利用Spring声明式事件办理。


3. 利用Spring声明式事件办理

1) 利用Spring 1.x 的事件代办代理类进行事件办理
   A. 在applicationContext.xml中声明事件办理器,注入sessionFactory属性

<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
   B. 在applicationContext.xml中利用Spring AOP代办代理体例实现声明式事件

<bean id="userInfoDAOProxy" class=
"org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<!--必须为true时CGLIB才不消强迫编写DAO接口-->

------分开线----------------------------
标签(Tag):Java JAVA实例教程 java法度代码
------分开线----------------------------
保举内容
猜你感兴趣