四、购物车情形讨论
如果不存在例如Hibernate这样的工具可用,或是在一种非Hibernate环境下,那么,你该如何设计这种类型的应用程序呢?以前人们所使用的方法是借助于数据库中的“分段表格”(staging table)(或“临时”表格,也称为“工作”表格)。因此,随着用户操作一系列的屏幕,把每一次回寄发送给服务器,打开一个新的Hibernate会话,执行相应的session.beginTransaction,然后调用一个或多个类似于“保存”这样的方法,最后实现事务提交。仅仅在上面一系列屏幕操作的最后—在业务事务或对话事务的最后—数据才从分段表格传递到永久性表格中;而且,此时才从分段表格中删除相同的数据。
我们认为,上面这种方法,对于Hibernate环境和非Hibernate环境都一样重要,并且使得事情相当简单而且可预测,并且此方法能够移植到任何数据库平台。
一般情况下,在永久性表格及其相应的分段表格结构之间很可能存在一些不同。例如,分段表格往往会包含一个例如Http会话ID这样的表格列,用于标识当前用户会话。而通常这个列是不会出现在永久表格中的。在你的servlet中,你可以通过下列语句来取得Http会话ID:
|
这两个表格中的主键—假定它是一个由数据库或Hibernate赋值的代理键—可能具有相同的数据类型或结构,但是却不会有相同的值。注意,在分段表中的主键值仅是一个临时值。
这两个表的记录结构之间还可能存在其它区别,这要由永久表格记录的处理方式来决定。
让我们假定,MySQL数据库中的car表格有可能会在一种multi-Http-request场所下使用,并且还需要一个分段表格。下面是这个分段表格可能的“create table”SQL语句:
|
car表格相应的create table SQL语句已在上一篇中描述过。这两个SQL语句之间的唯一区别在于:①表格名不同;②在car_staging表格中增加了一个http_session_id列。
下面是相应的Java源文件—Car_staging.java。它与上一篇中的模块Car.java几乎完全相同。
|
下面是相应的Hibernate映射文件。它与car表格相应的映射文件(上一篇中)也几乎一致。
|
当然,你不一定非用分段表格技术不可。但是,其它一些可选方案的重点也都应集中在分离(detaching)和重新依附(attaching),如何利用Hibernate所提供的锁机制,以及处理其它相关的问题方面。但是,为什么上面的方法更合乎需要呢?它对哪些内容进行了简化?
比方说,在与用户的若干交互过程中,你想从Hibernate会话中提取所有已经保存到其中的对象实例—很明显,此时你很可能会需要一个Iterator或Enumeration这样的工具。但是,你该如何实现呢?我们并不知道。因此,如果你需要对保存在Hibernate会话中的数据实现某种后处理期更新或查询的话;那么,除了你已经把此信息保存到Hibernate会话内以外,你还需要把对这种数据的独立参考保存在Hibernate会话外部。
如果你需要把更新信息存储到Hibernate会话的外部,那么,把此信息存储在Hibernate会话内还有什么意义呢?—此时,你甚至还不能遍历这些信息!因此,我们的意见是,最好是当你准备好提交时才把信息存储在Hibernate会话中。
除了上面的分段表格技术之外,还存在其它广泛使用的技术。例如,你还可以把与长时间运行的事务相关的信息存储在Http会话中(这不同与存储在Hibernate会话中的情形)。然而,如果把大量的数据存储在Http会话中,那么,你的应用程序的灵活性可能会受到影响。另外,服务器一端的簇管理也可能因此而成为问题。
你还可以选择以另外某种方式串行化信息并且把它下载到一个客户端HTML隐藏域中。然而,这个方法有可能导致在服务器和客户端之间来回传递大量的数据,并且你可能还需要采取其它一些措施以确保在浏览器端串行化的信息是安全的。在任何web应用程序中,存在三种如上所描述的支持购物车情形的方法:(1)分段表格技术;(2) 通过Http会话中的属性;(3)在HTML隐藏域内实现的串行化(这可能是极少使用的方法)。在非Hibernate环境下,如果使用当前最流行的web MVC技术—JSF,Spring MVC或Struts进行开发的话,那么,你一定会用到上面所描述的三种方法之一。我们认为,在开发一个基于Hibernate方案的web应用程序时也应该考虑一下上面这三种方法。当然,这要根据存储在活动购物车中信息的数量以及我们上面所列出的其它一些因素进行综合考虑才行。
(责任编辑 火凤凰 sunsj@51cto.com TEL:(010)68476636-8007)
| 共2页: 上一页 [1] 2 | ||
|
|
|||
| · 51CTO主编推荐经典专题 · RAID——磁盘阵列基础 · 充电计划之热门IT认证.. · 51CTO技术自测 挑战自.. · CISSP认证成长之路 · AMD Phenom三核处理器.. · 国际文档格式标准开战 · 2007年互联网大会 |
· 我是黑客我怕谁——讲.. · ARP攻击防范与解决方案 · Solaris 10 配置管理 · Solaris基础知识入门 · RIP路由协议专栏 · MPLS路由协议专栏 · OSPF路由协议专栏 · 思科路由器产品 |
||
|
|||
| · Java基础教程 · VPN技术 · ARP攻击防范与解决方案 · SQL Server 2005全解 · SOA 面向服务架构 · SQL Server 2005全解 · Java编程开发手册 · RAID——磁盘阵列基础 |
· 三层交换技术专题 · SQL Server入门到精通 · Windows Server 2003企.. · Windows远程桌面应用 · C#技术开发指南 · VPN技术 · Solaris 10 配置管理 · C#技术开发指南 |
||
|
|||
| · ARP攻击防范与解决方案 · VPN技术 · SQL Server 2005全解 · Java基础教程 · SQL Server入门到精通 · SQL Server 2005全解 · SOA 面向服务架构 · Java编程开发手册 |
· C#技术开发指南 · 三层交换技术专题 · C#技术开发指南 · Windows远程桌面应用 · RAID——磁盘阵列基础 · Windows Server 2003企.. · 邮件服务器专题 · wimax技术与趋势 |
||
| ·DB2 Viper快速入门 ·DB2 9数据库的镜像分割与.. |
·将XML应用程序从DB2 8.x.. ·DB2 9中的pureXML:如何.. |
| ·服务器中的“傻瓜机”在.. ·盖茨也喜欢登录Youtube看.. |
· · |
| ·拯救系统管理员 ·美国选民:我为什么选布什 |
·VMware公司中文命名挑战赛 ·我们真缺乏创新吗? |
| ·J0ker的CISSP之路:复习-.. ·J0ker的CISSP之路:复习-I.. |
·9月第3周安全回顾 内网安.. ·教你几招识别和防御Web网.. |
| · NGN:下一代网络 · 网络访问中断大排查 · FTTx光纤接入 |
· 教你使用Anti ARP Sniff.. · 网络嗅探教程:使用Snif.. · 常见病毒手工清除方法大.. |
| · C++是垃圾语言?! · 2007年IT界七大抄袭事件 · Java实用开发全集 |
· 解析Ajax开发框架 走进A.. · 基于Google Maps与Ajax.. · 基于Google Maps与Ajax.. |
| · 热门 IT 培训认证官方资.. · Ubuntu 中文开源频道 · Solaris基础知识入门 |
· 费力不讨好 数据中心主.. · AMD Phenom三核处理器解.. · 51CTO主编推荐经典专题 |
| · 甲骨文Oracle 11g正式发.. · Oracle数据库开发之PL/S.. · Oracle数据库开发基础教.. |
· 存储2006,一个并购的大.. · IDC宣布浪潮蝉联存储市.. · 双机热备技术 |