在当前的整合过程中,最常见的整合就是利用spring的HibernateTemplate或者是HibernateDaoSupport ,但是这都对底层的hibernater产生了侵入性,如果利用hibernate3的一个新的特性:“带上下文环境的Session”。 这与Spring中每个Hibernate的 Session
与事务同步的功能大致相同。即:sessionFactory.getCurrentSession()。他可以获取到在spring中配置的事务管理器中产生的session,这样就可以利用spring的事务管理 ,也可以把spring对hibernate的侵入性降到最低。
整个程序的框架是:使用了Service + DAO的模式,并将Service放在事务管理器中,采用声明式的事务管理,而DAO仅仅注入给Service,不进行事务管理。当时的理由是Service用来控制业务流程,应该由它决定事务的边界,DAO只是功能点,无需过问事务。
配置:
<!-- 读取 hibernate.cfg.xml配置文件 并产生sessionFactory对象,不采用在application.xml中
配置数据源什么的就是为了减少spring和hibernate的耦合度-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
</bean>
<!-- 原来读取 hibernate.cfg.xml并且产生sessionFactory和利用ThreadLocal保存和获取session的类-->
<bean id ="hibernateSessionFactory" class="com.mawujun.HibernateSessionFactory">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- 继承HibernateTemplate,获取事务管理器中创建的session ,这是另外种方法在不知道sessionFactory.getCurrentSession()。的情况下的折中方法。
<bean id="baseHibernateDAO1" class="com.mawujun.BaseHibernateDAO1">
<constructor-arg><ref bean="sessionFactory"/></constructor-arg>
</bean>
-->
<!--- BaseHibernateDAO依赖于HibernateSessionFactory,主要是用HibernateSessionFactory.getSession()--->
<bean id="baseHibernateDAO1" class="com.mawujun.BaseHibernateDAO">
</bean>
<!-- 或直接让BaseHibernateDAO依赖于SessionFactory ,这样更好session 就完全交给spring去控制 -->
<bean id="baseHibernateDAO1" class="com.mawujun.BaseHibernateDAO2">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- dao对象 依赖于BaseHibernateDAO, -->
<bean id="userdao" class="com.mawujun.TUserDAO">
<property name="baseHibernateDAO1">
<ref bean="baseHibernateDAO1"/>
</property>
</bean>
<!-- 日志记录的aop -->
<bean id="myAdvisor" class="com.mawujun.TestBeforeAdvice">
</bean>
<bean id="userDaoPeoxy"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>com.mawujun.TUserDAOInter</value>
</property>
<property name="target">
<ref local="userdao" />
</property>
<property name="interceptorNames">
<list>
<value>myAdvisor</value>
</list>
</property>
</bean>
<!-- 服务层的配置 -->
<bean id="service" class="com.mawujun.Service">
<property name="userDAO">
<ref local="userdao"/>
</property>
</bean>
<!-- 事务管理者 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<bean id="serviceTransPorxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="find*">
PROPAGATION_REQUIRED,-java.lang.Exception
</prop>
<prop key="update*">
PROPAGATION_REQUIRED,-java.lang.Exception
</prop>
<prop key="save*">
PROPAGATION_REQUIRED
</prop>
</props>
</property>
<property name="proxyInterfaces">
<list>
<value>com.mawujun.Iservice</value>
</list>
</property>
<property name="target">
<ref bean="service" />
</property>
</bean>
总体来说,DAO可以基于Hibernate3的原生API实现,同时,它依旧需要能够参与到Spring的事务管理中。 这对于那些已经对Hibernate非常熟悉的人来说很有吸引力,因为这种方式更加自然。 不过,此时的DAO将抛出HibernateException,因而,如果有必要的话,需要明确地去做由 HibernateException
到Spring的 DataAccessException
的转化。
http://blog.sina.com.cn/s/blog_4a5ca024010005yz.html
另外种实现方法:链接: http://hi.baidu.com/injava/blog/item/c08eaf3823f99ec3d4622528.html
(完全拷贝 谢谢macaque1101 )
Hibernate与Spring整合后,就可以使用IoC及AOP的功能了,好处不在多言。另外一个好处,就是可以通过使用Spring的HibernateTemplate来简化数据库CRUD代码。然而,正是这个HibernateTemplate,存在着以下的缺点:
一是功能不全,不如Hibernate的储如createQuery()等方法方便、灵活与强大,使用颇受限制;
二是HibernateTemplate中的SessionFacotry封装得太死,且session常常会自动过早关闭,使用上颇多不便;
三是Spring1.2.7实际上只支持Hibernate3.0.5,HibernateTemplate无法使用Hibernate3.1以后新加的功能。
正是由于这三点,使我抵制住了使用HibernateTemplate的诱惑,在将Spring与Hibernate整合后,通过简单的配置,在Spring程序中自由地使用Hibernate3.1.2的功能。这样既可以实现强强联手,又可以在Hibernate新版本出来后,马上进行重新整合,无需等着新版的Spring出来。
在实现上,主要有三点。
一是在Spring的配置文件中,无需定义长长的hibernateTemplate,只需定义sessionFacotry就行了。
例如,设有一"组织DaoImpl",实现了"组织Dao"及"HibernateDao"两个接口。而"组织Service"通过将"组织DaoImpl"封装起来,对外提供相应的数据库功能服务。
public interface HibernateDao {
public void setSessionFactory(SessionFactory sessionFactory);
}
public interface 组织Dao {
public void 增加组织(组织 组织);
public void 删除组织(Long 组织编号);
public 组织 get组织By名称(String 组织名称);
......
}
public class 组织DaoImpl implements 组织Dao, HibernateDao {
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public 组织 get组织By名称(String 组织名称) {
......
}
}
public interface 组织Service {
public 组织 get组织By名称(String 组织名称);
......
}
(实际代码中,组织Service与组织DaoI的接口是一样的)
先在Spring的配置文件中定义"组织Service"与"组织Dao":
<bean id="组织Service"
class="com.sarkuya.service.组织ServiceImpl">
<property name="组织Dao">
<ref bean="组织Dao" />
</property>
</bean>
<bean id="组织Dao"
class="com.sarkuya.model.dao.hibernate.组织DaoImpl">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
这一步比较好理解。问题是如何将我们所需的sessionFactory传过来。Hibernate的sessionFactory不是一个可以用构造方法或setter方法就可以直接生成的类,而是需要进行一定的"运算"后才得出的类,典型的形式如:
sessionFactory = new Configuration().buildSessionFactory();
因此,简单地在Spring中如下配置行不通。
<bean id="sessionFactory"
class="org.hibernate.SessionFactory">
<property name="xxx">
<value>xxx</valu>
</property>
</bean>
所幸,Spring提供了一种可定义由工厂方法所产生的bean的方式。
<bean id="sessionFactory"
class="com.sarkuya.hibernate.util.HibernateUtil"
factory-method="getSessionFactory" />
这种方式,当我们需要得到sessionFacotry的bean时,Spring就会从com.sarkuya.hibernate.util.HibernateUtil的getSessionFactory()方法中获得。这种方式,我们最熟悉不过了:
public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
sybaseSessionFactory = new Configuration()
.addClass(com.sarkuya.model.cfg.hibernate.组织.class)
.configure("/hibernate_hsql.cfg.xml")
.buildSessionFactory();
} catch (Throwable ex) {
System.err.println("Initial SessionFactory creation failed." + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
好了,以上步骤,我们已经成功地将sessionFactory注入组织Dao中,再注入组织Service中,根据测试先行原则,看看如何在TestCase中获取组织Service这个bean。
二,在代码中获取组织Service。
public class 组织ServiceTest extends TestCase {
private 组织Service 组织Service;
protected void setUp() throws Exception {
String[] configLocation = new String[] {
"/web/WEB-INF/training-service.xml",
"/web/WEB-INF/training-data.xml"
};
ApplicationContext ac = new FileSystemXmlApplicationContext(configLocation);
组织Service = (组织Service)ac.getBean("组织Service");
}
public void testGet组织By名称() {
System.out.println("get组织By名称");
组织 组织 = 组织Service.增加组织(new 组织("aaa"));
组织 = 组织Service.get组织By名称("aaa");
assertEquals("aaa", 组织.get名称());
组织 = 组织Service.get组织By名称("abc");
assertNull(组织);
}
}
三,组织DaoImpl的代码:
/*
* @param 组织名称
* @return 组织 或者 null
*/
public 组织 get组织By名称(String 组织名称) {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction(); //Hiberante3.1以后的代码
组织 组织 = (组织)session.createQuery("from 组织 c where c.名称 = '" + 组织名称 + "'")
.uniqueResult();
session.getTransaction().commit();
return 组织;
}
由上可见,Hibernate的核心代码一点未变,从而在与Spring整合的基础上,实现了与Spring的解耦。
分享到:
相关推荐
《Spring与Hibernate整合详解》 在现代Java Web开发中,Spring和Hibernate是两个非常重要的开源框架,它们分别在依赖注入和对象关系映射(ORM)领域有着广泛的应用。Spring作为一个全面的轻量级应用框架,提供了...
这个简单的示例展示了Spring和Hibernate整合的基本流程,实际项目中可能还需要考虑更多的细节,如异常处理、事务策略等。 总结来说,Spring与Hibernate的整合使得Java开发人员能够更方便地管理数据库操作,并利用...
这个“Spring+hibernate整合源代码”应该包含了实现上述整合步骤的示例代码,可以作为学习和参考的资源。通过学习和实践这些代码,你可以更好地理解和掌握 Spring 和 Hibernate 整合的细节,提升你的 Java Web 开发...
Struts2、Spring和Hibernate是Java Web开发中的三大框架,它们各自解决应用程序的不同问题,而将这三者整合在一起可以构建高效、灵活的企业级应用。Struts2作为MVC(Model-View-Controller)框架,负责处理用户请求...
总的来说,这个压缩包为开发者提供了一个完整的Spring和Hibernate整合环境,省去了寻找和管理依赖项的麻烦,使得开发人员可以更专注于业务逻辑的实现,提高开发效率。在实际开发中,只需根据项目的具体需求,合理...
标题"spring+hibernate整合demo"表明这是一个示例项目,展示了如何将Spring和Hibernate这两个框架结合使用。整合Spring和Hibernate可以使应用程序更易于管理,因为Spring可以控制Hibernate的生命周期,并提供事务...
通过以上步骤,一个基本的Struts、Spring和Hibernate整合的应用就搭建完成了。这个整合的关键在于Struts处理HTTP请求,Spring管理业务对象和依赖,而Hibernate则处理数据库操作。这样的架构可以实现松耦合,便于代码...
本文将深入探讨如何将Spring与Hibernate整合,以及在实际应用中如何利用Spring的HibernateTemplate进行数据操作。 首先,让我们理解Spring与Hibernate整合的基本原理。整合的主要目标是利用Spring的IoC容器管理...
总之,Spring 和 Hibernate 的整合是 Java Web 开发中的常见实践,它利用 Spring 的强大管理能力和事务处理,结合 Hibernate 的 ORM 功能,简化了数据库操作和事务管理,提高了软件的可扩展性和可维护性。...
3. **Spring与Hibernate整合** - **事务管理**:Spring可以接管Hibernate的事务管理,通过PlatformTransactionManager接口实现声明式事务管理,使得事务控制更为简洁。 - **SessionFactory的获取**:Spring通过...
在Java企业级开发中,Spring框架和Hibernate框架的整合是常见的技术栈选择,它们能够帮助开发者构建高效、灵活且易于维护的后端系统。本文将深入探讨如何在JavaEE项目中整合Spring和Hibernate,以及hibernate.cfg....
"Spring与Hibernate整合"是为了实现业务逻辑层和数据访问层的高效协作。整合过程通常包括以下几个步骤: 1. **引入依赖**:首先,需要在项目中添加Spring和Hibernate的相关库。这通常通过Maven或Gradle的依赖管理来...
总结起来,"spring-Hibernate整合代码测试过程"涉及了Spring框架的依赖注入、事务管理、以及与Hibernate的整合,同时也涵盖了Hibernate的实体映射、DAO设计和事务控制。通过这个过程,我们可以构建出一个高效、健壮...
在"25_黑马程序员_黎活明_Spring2.5视频教程_搭建和配置Spring与Hibernate整合的环境.avi"这个文件中,可能详细演示了如何配置这些库到项目的类路径中。 接着,需要配置Spring的IoC容器。这可以通过XML配置文件完成...
### Spring与Hibernate整合的优化配置 #### 一、Spring与Hibernate简介 - **Spring框架**:作为Java开发领域中的一款主流轻量级框架,Spring主要提供了依赖注入(DI)和面向切面编程(AOP)的功能,使得Java开发...
通过以上步骤,我们可以成功地将Spring MVC、Spring和Hibernate整合在一起,实现一个完整的登录功能。这样的实例不仅有助于学习者理解各框架的协同工作方式,而且为实际项目提供了可复用的基础结构。在实践中,还...
综上所述,这个压缩包文件提供的内容很可能是关于Spring和Hibernate整合的一个实例教程,涵盖了SSH集成的基本步骤,包括框架的配置、实体模型设计、持久化操作以及事务管理。对于想要学习或加深理解SSH整合的开发者...
5. **整合Spring和Hibernate**:在Spring的配置文件中,定义Hibernate的SessionFactory bean,并配置事务管理器。使用`LocalSessionFactoryBean`来创建SessionFactory,通过`HibernateTransactionManager`进行事务...