Spring与Hibernate的整合与解耦

MVC三层模型(struts+spring+hibernate)总结 简单的说: struts 控制用的 hibernate 操作数据库的 spring 用解耦的 详细的说: STRUTS 在 SSH 框架中起控制的作用 , 其核心是 Controller, 即 ActionServlet, 而 ActionServlet 的核心就是 Struts-confi g.xml. 主要控制逻辑关系的处理 . hibernate 是数据持 阅读详情
Spring与Hibernate的整合与解耦

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的解耦。


转自:http://hi.baidu.com/injava/blog/item/c08eaf3823f99ec3d4622528.html


Spring+SpringMVC+Hibernate整合框架项目实战搭建 SSH框架由Spring、SpringMVC和Hibernate三大开源框架整合而成,代表了Java EE轻量级开发的经典范式。Spring作为核心容器,通过控制反转(IoC)和依赖注入(DI)实现组件解耦与集中管理;SpringMVC基于MVC模式构建Web层,依托实现请求分发与视图渲染;Hibernate则作为ORM框架,将数据库表自动映射为Java实体类,屏蔽JDBC底层细节。// 示例:Hibernate实体类与表的映射@Entity@Id。 阅读详情

相关推荐

Maven整合Spring+SpringMVC+Hibernate+SpringDataJPA企业级项目实战

回顾这一路,你会发现这些框架背后藏着共同的设计思想:约定优于配置:少写XML,多用注解松耦合:IoC让组件之间彼此无知横切分离:AOP把通用逻辑抽离自动化:Spring Data JPA消灭模板代码标准化:Maven统一构建流程它们不是孤立存在的工具,而是一整套现代化Java开发的方法论。掌握它们,不只是学会几行代码,更是获得一种构建高质量系统的思维方式。所以别再说“Spring太复杂了”,试着换个角度:它是在帮你把混乱的世界变得有序啊 ❤️。

weixin_42514540的博客 634

hibernate总结

对象---表:先映射再查 先映射对象,再去数据库查询 不用操作sql。纯面向对象的关系型数据库,全自动性数据库框架 一系列的Java类借口和配置文件/session/session工厂 配置文件:数据源/映射文件(理解) Java与数据库的解耦 ORM: 数据库与表的映射 hibernate:中有三个状态 瞬态对象(引用失效就会被回收new),如果跟某个连接关

J_J_Q的博客 363

SSH框架整合全攻略:从jar包到实战应用

本文还有配套的精品资源,点击获取 简介:Struts、Spring和Hibernate是Java Web开发中的核心框架,分别处理Web应用的MVC流程、后端管理和数据库操作。整合这三大框架,可形成一套功能强大的开发架构。本篇将介绍如何整合SSH框架,包括所需jar包、配置步骤和整合后的优势。开发者需要掌握Spring配置、Struts映射以及Hibernate映射,才能实...

weixin_30838971的博客 1499

Spring、Hibernate 解耦方法与设计模式(1)

Spring、Hibernate 解耦方法与设计模式(1) 1、Spring resource与策略模式  不同子类(如:UrlResource、ClassPathResourse...)实现同一个接口(如:Resource)中的方法(策略),不同子类对该方法的实现不同。再实现一个中间类根据注入的不同子类,调用不同子类的同名方法,策略调用者通过中间类使用不同策略。实现策略调用者与不同策

Dreamcode ~ All in AI 2426

如果使用ssms连接SQLserver的时候出现无法连接到服务器。

如果使用ssms连接SQLserver的时候出现无法连接到服务器。 Lan 2020-03-29 22:11 329 人阅读 0 条评论 标题: 连接到服务器------------------------------无法连接到...

Vastsa的博客 1万+

ANSYS Workbench瞬态结构分析(1)时域分析

本文围绕瞬态结构分析展开。首先阐释其概念与理论基础,涵盖控制方程及数值求解方法。接着详述在 ANSYS Workbench 中进行瞬态分析的操作流程,以音叉为例,介绍从创建分析系统、材料定义、几何处理与网格划分,到边界条件与载荷设置、求解器设置及结果后处理的各步骤。之后对分析结果进行探讨,并针对计算不收敛、计算时间过长等常见问题给出调试技巧,旨在为读者提供全面的瞬态结构分析知识与实践指导。

qq_58675332的博客 6532

Hibernate阶段性总结(一)

hibernate它是一个实现对JDBC轻量级封装的ORM(对象关系映射)的框架。处于项目的持久层。主要学习它的hibernate api和hibernate.cfg.xml,对象关系映射文件 这边介绍下项目的组成部分: WEB层   业务逻辑层(调用HQL语句去操纵持久层,这样就不用去关心到底使用哪种数据库,持久层会自己去判断)  DAO层  持久层(对JDBC进行轻量级封装,

像风一样奔跑 3393

从原理到实战:ARS548 4D毫米波雷达数据处理与多模态融合全解析

本文深入解析了4D毫米波雷达ARS548的工作原理与数据处理全流程。从FMCW测距测速、MIMO虚拟天线阵列到点云生成的三步FFT处理,提供了详尽的Python代码实现。文章进一步探讨了与激光雷达、相机的多模态时空对齐与融合策略,并指导如何构建用于自动驾驶感知训练的多模态标注数据集,为相关算法工程师提供了从理论到实践的完整指南。

weixin_29161719的博客 369

Spring学习--实体类通过xml映射解耦

初级JAVA开发,根据工作需要,领导要求学习Spring框架,用户新项目的开发。根据近日学习心得,总结出使用spring框架流程:①新建项目(new Java project);②导入项目的依赖包,具体流程为:右击项目--Build Path--Configure Build Path--Libraries--Add External JARs。关于依赖包的说明,我下载的是4.2.8版本的spri...

shqchen922的博客 610

算法设计与分析 0-1背包问题 动态规划解法【超详细】

0-1背包问题 问题描述 给定i个物品和一个容量为的背包,物品的重量是Wi,其价值为Vi 物品个数为i,背包容量为C。 如何选择装入背包内的物品,使得装入背包中的物品的总价值最大? 其中,每种物品只有全部装入背包或不装入背包两种选择。 物品不能分割,不能重复使用。 动态规划算法思路 首先建立一个数组B[i][c],最上面一行表示背包容量,最左边一列表示物品编号,中间填充的数值表示当当前背包容量为C...

寒泉 4万+

Loupe Browser实战指南:解锁10xGenomics单细胞数据的可视化奥秘

本文提供了Loupe Browser的实战指南,帮助用户无需编程即可探索和可视化10xGenomics单细胞数据。文章详细介绍了从数据导入、界面导航到细胞亚群鉴定、差异基因分析的核心操作流程,并分享了高级技巧与避坑指南,是快速上手这一强大可视化工具的必备参考。

weixin_29313423的博客 208

struts2整合spring2,hibernate3~

struts2整合spring2是通过插件的形式整合的,这也是struts2的一个优点,可插拔式的轻量级框架。可以讲Action的实例交ioc容器进行管理,这样有助于更好的分层解耦,当然也可以利用spring的自动装配注入action实例,但是通过修改 struts.objectFactoryy.spring.atuoWrie常量改变自动装配策略有个bug,就是无法修改默认的name策略。 ...

shiyongyin的专栏 128

Windowns下Git环境配置-命令行方式

文章目录一、配置Git1.1 下载Git并安装1.2 配置本地Git用户名和邮箱1.3 注册GitHub二、生成本地公钥,放到GitHub上-SSH Key2.1 生成本地公钥命令2.2 查看生成的公钥2.3 在GitHub放上公钥并测试连通性三、创建项目实操四、可能出现的问题4.1.push不成功4.2.提示SSL的问题4.3.域名不能解析的问题4.4.如果github连接不上的问题 一、配置Git 1.1 下载Git并安装 Git官网 默认安装,根据需要修改安装路径 1.2 配置本地Git用户名和邮箱

学习工作笔记 1137

struts + hibernate + spring 整体的认识

 首先struts一定要用熟了 1.struts + hibernate 当struts你熟练了以后,考虑数据库用个框架的时候,用hibernate struts是MVC,那么也就是数据持久层该用hibernate hibernate正常配就行,dao自己封一个 2.struts + spring 有人说,用spring,你的春天就来了 spring为了解耦,如果你总出bug,记得一定要考虑把ac

wanghexin701的专栏 584

mjlab & MimicKit 宇树 G1 人形机器人强化学习训练部署

基于mjlab框架训练Unitree G1人形机器人执行双旋踢的示例。参考动作源自Jason Peng的MimicKit项目。数据转换脚本(MimicKit pkl → mjlab csv)完整训练结果与超参数预训练ONNX检查点用于部署实体硬件部署指南⚠️ 免责声明仅用于教育目的。对于因尝试复现此处展示结果而导致的财产损失或人身伤害,我们概不负责。操作硬件时请谨慎行事并保持良好判断力。

2506_90492529的博客 1702

ABAP RANGES及比较符号

RANGES *选项介绍: *1.SIGN 值为 I 和 E 。 I是包含, E是排除, 一般使用I。 2.OPTION 如果HIGH 为空 ,为单值选择 。有 EQ、NE、GT、LE、LT等逻辑操作 对于的 CP包含 NP是排除 如果HIGH 不为空 为区间选择 有BT,NB可选 *3.LOW 低值 *4.HIGH 高值 lt:less than 小于 le:less than or equal to 小于等于 eq:equal to 等于 ne:

Pegasus666的博客 5390

使用struts+spring+hibernate 组装web应用

其实,就算用Java建造一个不是很烦琐的web应用,也不是件轻松的事情。 在构架的一开始就有很多事情要考虑。 从高处看,摆在开发者面前有很多问题:要考虑是怎样建立用户接口?在哪里处理业务逻辑? 怎样持久化的数据。 而这三层构架中,每一层都有他们要仔细考虑的。 各个层该使用什么技术? 怎样的设计能松散耦合还能灵活改变? 怎样替换某个层而不影响整体构架?应用程序如何做各种级别的业务处理(比如事务处

靠天靠地不如靠自己 575

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

使用Spring 管理Hibernate持久层有如下优势

通过Spring 整合Hibernate ,使持久层的访问更加容易,使用Spring 管理Hibernate持久层有如下优势。·通用的资源管理: Spring 的ApplicationContext 能管理SessionFactory ,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。·有效的Session 管理: Spring 提供了有效、简单和安全的Hibernate S

yzhjisji的专栏 513

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SSH和MVC的关系

SSH和MVC不能直接联系,对于B/S架构,Web层才存在MVC。    SSH 它就是一个架构 MVC 它是一种思想    程序从大方面分成三层:表示层、业务层、持久层;表示层也可以说是Web层,业    务层对应的是Service,持久层对应的是DAO。    Web层又分成MVC,Struts 属于Web层;Hibernate是持久层;实体对象(POJO)不    属于

caomiao2006的专栏 7722

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Spring集成Hibernate 《Srping in action》阅读笔记

一,使用Hibernate模板 与hibernate进行交互的接口是org.hibernate.Session。这个Session接口提供了基本的数据访问功能,比如从数据库保存、更新、删除和加载对象。 获得Hibernate Session对象应用的标准方式是实现Hibernate的sSessionFactory接口。SessionFactory负责打开、关闭和管理Hibernate Sess...

weixin_33691700的博客 92

什么是框架?常用框架有哪些?

1. 框架简介 目标 了解什么是框架 理解框架解决的问题 讲解 1.1 什么是框架 框架是整个或部分应用的可重用设计,是可定制化的应用骨架。它可以帮开发人员简化开发过程,提高开发效率。 项目里有一部分代码:和业务无关,而又不得不写的代码==>框架 项目里剩下的部分代码:实现业务功能需要的逻辑代码 简而言之,框架是一个应用系统的半成品,开发人员在框架的基础上,根据业务需求开发功能。即:别人搭台,你唱戏。 1.2 框架解决了什么问题 ​ 框架主要是解决了技术整合问题,实现了项目和具体技术的解

weixin_68107783的博客 4284
上一篇: IT人分类,你属于哪个级别?
下一篇: 用spring控制hibernate的session何时关闭
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值