设为首页 | 添加收藏
首 页 走进石竹 石竹动态 产品中心 解决方案 服务体系 知识中心 招贤纳士
 
K 知识中心  
数据治理
元数据
数据质量
技术讲坛
下载
 
C 联系方式  
北京:(8610)68707181
西安:(8629)89181329
销售联系:
info@
技术支持:
support@
 
 
  当前位置: 首页 >> 知识中心 >> Java编程和Java企业应用
Java编程和Java企业应用
发布日期:※※※※ 2017-05    阅读次数: 7965

Hibernate

Hibernate是一个开放 源代码的对象关系映射框架,它对JDBC进行了非常 轻量级的对象封装,使得Java程序员可以 随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在 任何使用JDBC的场合,既 可以在Java的客户端程 序使用,也可以在Servlet/JSPWeb应用中使用 ,最具革命意义的是,Hibernate可以在应用 EJBJ2EE架构中取代 CMP,完成数据 持久化的重任。


Hibernate最佳实践:

 

设计细颗粒 度的持久类并且使用<component>来实现映射 。

使用一个Address持久类来封 装 street, suburb, state, postcode. 这将有利于 代码重用和简化代码重构(refactoring)的工作。

对持久类声 明标识符属性。

Hibernate中标识符属 性是可选的,不过有很多原因来说明你应该使用标识符属性。我们建议标识符应该是人造(自动生成, 不涉及业务含义)。虽然原生 类型从语法上可能更易于使用,但使用longjava.lang.Long没有任何区 别,。

为每个持久 类写一个映射文件

不要把所有 的持久类映射都写到一个大文件中。把 com.eg.Foo 映射到com/eg/Foo.hbm.xml中, 在团队开发 环境中,这一点显得特别有意义。

把映射文件 作为资源加载

把映射文件 和他们的映射类放在一起进行部署。

考虑把查询 字符串放在程序外面

如果你的查 询中调用了非ANSI标准的SQL函数,那么 这条实践经验对你适用。把查询字符串放在映射文件中可以让程序具有更好的可移植性。

使用绑定变 量

就像在JDBC编程中一样 ,应该总是用占位符"?"来替换非常 量值,不要在查询中用字符串值来构造非常量值!更好的办法是在查询中使用命名参数。

不要自己来 管理JDBC connections

Hibernate允许应用程 序自己来管理JDBC connections,但是应该 作为最后没有办法的办法。如果你不能使用Hibernate内建的connections providers,那么考虑 实现自己来实现org.hibernate.connection.ConnectionProvider

考虑使用用 户自定义类型(custom type)

假设你有一 个Java类型,来自 某些类库,需要被持久化,但是该类没有提供映射操作需要的存取方法。那么你应该考虑实现net.sf.hibernate.UserType接口。这种 办法使程序代码写起来更加自如,不再需要考虑类与Hibernate type之间的相互 转换。

在性能瓶颈 的地方使用硬编码的JDBC

在对性能要 求很严格的一些系统中,一些操作(例如批量更 新和批量删除)也许直接使※※ 用JDBC会更好,但 是请先搞清楚这是否是一个瓶颈,并且不要想当然认为JDBC一定会更快 。如果确实需要直接使用JDBC,那么最好※ 打开一个 Hibernate Session 然后从 Session获得connection,按照这种 办法你仍然可以使用同样的transaction策略和底层 的connection provider

理解Session清洗( flushing

Session会不时的向 数据库同步持久化状态,如果这种操作进行的过于频繁,性能会受到一定的影响。有时候你可以通过禁止自动flushing,尽量最 小化非必要 的flushing操作,或者 更进一步,在一个特定的transaction中改变查询 和其它操作的顺序。

在三层结构 中,考虑使用 saveOrUpdate()

当使用一个 servlet / session bean 类型的架构 的时候, 你可以把已 加载的持久对象在session bean层和servlet / JSP 层之间来回 传递。使用新的session来为每个请 求服务,使用 Session.update() 或者Session.saveOrUpdate()来更新对象 的持久状态。

在两层结构 中,考虑断开session.

为了得到最 佳的可伸缩性,数据库事务(Database Transaction)应该尽可能 的短。但是,程序常常需要实现长时间运行的应用程序事 务(Application Transaction)”,包含一个从用户的观点来看的原子操作。这个应用程序事 务可能跨越多次从用户请求到得到反馈的循环。请使用脱管对象( session脱离的对象※※※※ ),或者在两 层结构中,把Hibernate SessionJDBC连接中脱离 开,下次需要用的时候再连接上。绝不要把一个Session用在多个应用程序事 务(Application Transaction)中,否则你 的数据可能会过期失效。

不要把异常 看成可恢复的

这一点甚至 比最佳实践还要重要, 这是必备常识。当异常发 生的时候,必须要回滚 Transaction ,关闭Session。如果你不 这样做的话,Hibernate无法保证内 存状态精确的反应持久状态。尤其不要使用Session.load()来判断一个 给定标识符的对象实例在数据库中是否存在,应该使用find()

对于关联优 先考虑lazy fetching

谨慎的使用 主动外连接抓取(eager (outer-join) fetching)。对于大多 数没有JVM级别缓存的 持久对象的关联,应该使用代理(proxies)或者具有延 迟加载属性的集合(lazy collections)。对于被缓 存的对象的关联,尤其是缓存的命中率非常高的情况下,应该使用outer-join="false",显式的禁 止掉eager fetching。如果那些 特殊的确实适合使用outer-join fetch 的场合,请 在查询中使用left join

考虑把Hibernate代码从业务 逻辑代码中抽象出来

Hibernate的数据存取 代码隐藏到接口(interface)的后面,组 合使用DAOThread Local Session模式。通过 HibernateUserType,你甚至可 以用硬编码的JDBC来持久化那 些本该被Hibernate持久化的类 。 (该建议更适 用于规模足够大应用软件中,对于那些只有5张表的应用 程序并不适合。)

使用与业务 有关的键值来实现equals() hashCode() .

如果你在Session外比较对象 ,你必须要实 现equals() hashCode() Session内部,Java的对象识别 机制是可以保证的。如果你实现了这些方法,不要再使用数据库(主键)辨识!瞬时 对象不具有(数据库)标识 值,Hibernate会在对象被 保存的时候赋予它一个值。如果对象在被保存的时候位于Set内,hash code就会变化, 要约就被违背。为了实现用与业务有关的键值编写equals() hashCode(),你应该使 用类属性的唯一组合。记住,这个键值只是当对象位于Set内部时才需 要保证稳定且唯一,并不是在其整个生命周期中都需要(不需要达到数据库主键这样的稳定性)。绝不要在equals()中比较集合 (要考虑延迟装载),并且小心对待其他可能被代理过的类。

不要用怪异 的连接映射

多对多连接 用得好的例子实际上相当少见。大多数时候你在连接表中需要保存 额外的信息。这种情况下,用两个指向中介类的一对多的连接比较好。实际上,我 们认为绝大 多数的连接是一对多和多对一的,你应该谨慎使用其它连接风格,用之前问自己一句,是否真的必须这么做。

 

Rod Johnson2002年编著的《 Expert one to one J2EE design and development

中,对Java EE正统框架臃 肿、低效、脱离现实的种种现状提出了质疑,并积极寻求探索革新之道。以此书为指导思想,他编写了interface21框架,这是 一个力图 冲破Java EE传统开发的 困境,从实际需求出发,着眼于轻便、灵巧,易于开发、测试和部署的轻量级开发框架。Spring框架即以interface21框架为基 础,经过重 新设计,并不断丰富其内涵,于2004324,发布了1.0正式版。同 年他又推出了一部堪称经典的力作《Expert one-to-one J2EE Development without EJB》,该书在 Java世界掀起了 轩然大波,不断改变着Java开发者程序 设计和开发的思考方式。在该书中,作者根据自己多年丰富的实践经验,对EJB的各种笨重 臃肿的结构进行了逐一的分析和否定,并分别以简洁实用的方式替换之。至此一战功成,Rod Johnson成为一个改 变Java世界的大师 级人物。

  传统J2EE应用的开发 效率低,应用服务器厂商对各种技术的支持并没有真正统一,导致J2EE 的应用没有※※※ 真正实现Write OnceRun Anywhere的承诺。Spring作为开源的 中间件,独立于各种应用服务器,甚至无须应用服务器的支持,也能提供应用服务器的功能,如声明式事务等。

  Spring致力于J2EE应用的各层 的解决方案,而不是仅仅专注于某一层的方案。可以说Spring是企业应用 开发的一站式选择,并贯 穿表现层、业务层及持久层。然而,Spring并不想取代 那些已有的框架,而是与它们无缝地整合。

 

Spring 框架

Spring 框架是一个 分层架构,由 7 个定义良好 的模块组成。Spring 模块构建在 核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如 图 1 所示。


1. Spring 框架的 7 个模块


组成 Spring 框架的每个 模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

核心容器: 核心容器提供 Spring 框架的基本 功能。核心容器的主要组件是 BeanFactory,它是工厂 模式的实现。BeanFactory 使用控制反 转 IOC 模式将应用 程序的配置和依赖性规范与实际的应用程序代码分开。

Spring 上下文:Spring 上下文是一 个配置文件,向 Spring 框架提供上 下文信息。Spring 上下文包括 企业服务,例如 JNDIEJB、电子邮件 、国际化、校验和调度功能。

Spring AOP:通过配置 管理特性,Spring AOP 模块直接将 面向方面的编程功能集成到了 Spring 框架中。所 以,可以很容易地使 Spring 框架管理的 任何对象支持 AOPSpring AOP 模块为基于 Spring 的应用程序 中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可 以将声明性事务管理集成到应用程序中。

Spring DAOJDBC DAO 抽象层提供 了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写 的异常代码 数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从 通用的 DAO 异常层次结 构。

Spring ORMSpring 框架插入了 若干个 ORM 框架,从而 提供了 ORM 的对象关系 工具,其中包括 JDOHibernate iBatis SQL Map。所有这些 都遵从 Spring 的通用事务 和 DAO 异常层次结 构。

Spring Web 模块:Web 上下文模块 建立在应用程序上下文模块之上,为基于 Web 的应用程序 提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化 了处理多部分请求以及将请求参数绑定到域对象的工作。

Spring MVC 框架:MVC 框架是一个 全功能的构建 Web 应用程序的 MVC 实现。通过 策略接口,MVC 框架变成为 高度可配置的,MVC 容纳了大量 视图技术,其中包括 JSPVelocityTilesiText POI

Spring 框架的功能 可以用在任何 J2EE 服务器中, 大多数功能也适用于不受管理的环境。Spring 的核心要点 是:支持不绑定到特定 J2EE 服务的可重 用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 Web EJB)、独立应 用程序、测试环境之间重用。

Struts 2

Struts 2 概述

   Struts 2Struts的下一代产 品。是在 struts WebWork的技术基础 上进行了合并,全新的Struts 2框架。其全 新的Struts 2的体系结构 与Struts 1的体系结构 的差别巨大。Struts 2WebWork为核心,采 用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开 ,所以Struts 2可以理解?/td>

 
 
关闭窗口
 
石竹软件 版权所有 | 公司月刊 | 招贤纳士 | 石竹质量 | 联系我们 | 邮箱登录 |
销售联系电 话:010-68707181
销售联系邮 箱:info@
友情链接:    双彩论坛   球探网即时比分手机   彩票专家排行榜   彩客彩票app   大乐透开奖直播