软件架构乱谈—SSH框架

简介:

    不废话,直入主题。SSH框架(Struts + Spring + Hibernate)不用介绍,相信大家非常熟悉了。许多使用SSH进行开发java项目在开发效率和效果上都非常不错,但同时也有人质疑SSH中的Hibernate,指责其速度较慢。但今天,我想从另外一个角度谈谈我对Hibernate的看法,欢迎怕砖:)

    Hibernate是一个ORM框架,主要处理ER(Entity-Relation)的问题。而Hibernate的本质,我认为有2点:

(1). 一个严格满足数据库3范式的框架。

(2). 一个自动化的DML的框架。

 

1. 下面是一个我遇到过的真实应用场景,大家可以参考一下:

        Category(分类)与Goods(商品),Category与Goods是一对多的关系,一个Category分类下可以有多个Goods,一个Goods只能属于一个Category。

    由于Category和Goods的关系,我们在实施的时候马上会碰到这样几个问题(这里先不考虑Hibernate自身的性能问题,因为它可以通过缓存解决。):

(1). Category对象中是否应该有一个Goods List呢?

(2). Goods对象中是应该否有一个Category对象?

……恩,在这种场景下,重点关注点应该是Goods(因为Goods的数量肯定远远大于Category),我的答案是:如果Goods数量不多的情况下, 这样做完全没问题,并且利用 Hibernate的特性我可以很轻易做到这一点,同时在使用Goods和Category的时候也方便。

    但如果在(中,大型系统中)Goods数量较多时,(1)的做法就显然有问题了。同时,(2)的做法也有一些问题,比如:如果Goods对象中存有了一个Category对象,那它是否需要把Type(商品类型)对象,Brand(商品品牌)对象……等等存于Goods对象中呢?等等,这样搞显然不行!那么,你现在应该会马上想到以下方案:

(3). Goods对象中存放category_id。

    恩,你的想法是对的。这里多数人的做法是:Goods表存放category_id,category_name,把category_name作为冗余存在Goods里面

    OK,到这里你发现Hibernate一个很重要的特性(对象关联)在这里用不上了。

 

2. 下面是另外一个问题:你认为在系统中很麻烦,但又经常会遇到的数据库操作是什么呢?

    应该是联表查询/联表操作,特别是中,大型系统,这种问题会经常遇到!显然,Hibernate对此问题都表示无能为力~~

 

3. 总结

    其实,以上两个问题都可以看作是:无法应用3范式的特征/不具备3范式特征,导致Hibernate功能大打折扣,这也和我之前提到的Hibernate本质有关。

    鉴于以上问题,Hibernate在中,大型系统中并不一定能带来多少好处,再加上性能的问题,所以在选用框架前一定要反复权衡!

    WEB应用中,Hibernate多数情况下会用在小型项目。而在ERP中,多数的小,中型项目会应用Hibernate(一般的ERP项目的数据库设计都严格按照范式进行),但大型ERP则一般不用Hibernate,这又涉及到另外一个问题,大型ERP项目数据模型可能有几百个,他们间关系复杂,要修改某个模型影响很大,非常痛苦!所以大型ERP项目多数采用MDA(Model-driven architecture)的方式,统一抽象模型层,他们用统一的接口进行数据查询,如:

 

    Map  =  Db.find(“Goods”,map{“name”,”id”,”price”};

 

其中代表作有:Ofbiz,用友U9……



本文转自hyddd博客园博客,原文链接:http://www.cnblogs.com/hyddd/archive/2011/05/11/2042780.html,如需转载请自行联系原作者。


目录
相关文章
|
4月前
|
存储 边缘计算 Cloud Native
“论模型驱动架构设计方法及其应用”写作框架,软考高级,系统架构设计师
模型驱动架构设计是一种用于应用系统开发的软件设计方法,以模型构造、模型转换和精化为核心,提供了一套软件设计的指导规范。在模型驱动架构环境下,通过创建出机器可读和高度抽象的模型实现对不同问题域的描述,这些模型独立于实现技术,以标准化的方式储存,利用模型转换策略来驱动包括分析、设计和实现等在内的整个软件开发过程。
162 3
|
4月前
|
分布式计算 大数据 数据处理
经典大数据处理框架与通用架构对比
【6月更文挑战第15天】本文介绍Apache Beam是谷歌开源的统一数据处理框架,提供可移植API,支持批处理和流处理。与其他架构相比,Lambda和Kappa分别专注于实时和流处理,而Beam在两者之间提供平衡,具备高实时性和数据一致性,但复杂性较高。选择架构应基于业务需求和场景。
233 3
经典大数据处理框架与通用架构对比
|
18天前
|
机器学习/深度学习
ACM MM24:复旦提出首个基于扩散模型的视频非限制性对抗攻击框架,主流CNN和ViT架构都防不住它
【9月更文挑战第23天】复旦大学研究团队提出了ReToMe-VA,一种基于扩散模型的视频非限制性对抗攻击框架,通过时间步长对抗性潜在优化(TALO)与递归令牌合并(ReToMe)策略,实现了高转移性且难以察觉的对抗性视频生成。TALO优化去噪步骤扰动,提升空间难以察觉性及计算效率;ReToMe则确保时间一致性,增强帧间交互。实验表明,ReToMe-VA在攻击转移性上超越现有方法,但面临计算成本高、实时应用受限及隐私安全等挑战。[论文链接](http://arxiv.org/abs/2408.05479)
36 3
|
21天前
|
Kubernetes Java Android开发
用 Quarkus 框架优化 Java 微服务架构的设计与实现
Quarkus 是专为 GraalVM 和 OpenJDK HotSpot 设计的 Kubernetes Native Java 框架,提供快速启动、低内存占用及高效开发体验,显著优化了 Java 在微服务架构中的表现。它采用提前编译和懒加载技术实现毫秒级启动,通过优化类加载机制降低内存消耗,并支持多种技术和框架集成,如 Kubernetes、Docker 及 Eclipse MicroProfile,助力开发者轻松构建强大微服务应用。例如,在电商场景中,可利用 Quarkus 快速搭建商品管理和订单管理等微服务,提升系统响应速度与稳定性。
34 5
|
1月前
|
存储 Java Maven
从零到微服务专家:用Micronaut框架轻松构建未来架构
【9月更文挑战第5天】在现代软件开发中,微服务架构因提升应用的可伸缩性和灵活性而广受欢迎。Micronaut 是一个轻量级的 Java 框架,适合构建微服务。本文介绍如何从零开始使用 Micronaut 搭建微服务架构,包括设置开发环境、创建 Maven 项目并添加 Micronaut 依赖,编写主类启动应用,以及添加控制器处理 HTTP 请求。通过示例代码展示如何实现简单的 “Hello, World!” 功能,并介绍如何通过添加更多依赖来扩展应用功能,如数据访问、验证和安全性等。Micronaut 的强大和灵活性使你能够快速构建复杂的微服务系统。
64 5
|
1月前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
59 2
|
1月前
|
设计模式 开发框架 前端开发
在开发框架中实现事件驱动架构
【9月更文挑战第2天】事件驱动架构(EDA)通过事件机制让组件间解耦交互,适用于动态扩展和高响应性的系统。本文提供一个基于Beego框架实现事件驱动的示例,通过事件管理器注册和触发事件,实现用户注册和登录时的不同处理逻辑,展示了其在Web应用中的灵活性和高效性。
67 5
|
2月前
|
XML 开发框架 .NET
.NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
93 1
|
2月前
|
消息中间件 Kafka Java
Spring 框架与 Kafka 联姻,竟引发软件世界的革命风暴!事件驱动架构震撼登场!
【8月更文挑战第31天】《Spring 框架与 Kafka 集成:实现事件驱动架构》介绍如何利用 Spring 框架的强大功能与 Kafka 分布式流平台结合,构建灵活且可扩展的事件驱动系统。通过添加 Spring Kafka 依赖并配置 Kafka 连接信息,可以轻松实现消息的生产和消费。文中详细展示了如何设置 `KafkaTemplate`、`ProducerFactory` 和 `ConsumerFactory`,并通过示例代码说明了生产者发送消息及消费者接收消息的具体实现。这一组合为构建高效可靠的分布式应用程序提供了有力支持。
91 0
|
2月前
|
资源调度 分布式计算 监控
【揭秘Hadoop YARN背后的奥秘!】从零开始,带你深入了解YARN资源管理框架的核心架构与实战应用!
【8月更文挑战第24天】Hadoop YARN(Yet Another Resource Negotiator)是Hadoop生态系统中的资源管理器,为Hadoop集群上的应用提供统一的资源管理和调度框架。YARN通过ResourceManager、NodeManager和ApplicationMaster三大核心组件实现高效集群资源利用及多框架支持。本文剖析YARN架构及组件工作原理,并通过示例代码展示如何运行简单的MapReduce任务,帮助读者深入了解YARN机制及其在大数据处理中的应用价值。
56 0