java facade dao_Facade与边界控制

多层结构是J2EE应用开发的基本模式,很多开发者都会按照多层结构来组织自己的应用(通常分为Facade,Application Service,DAO等层),但是他们往往会选择在不同层上去控制事务和Hibernate Session的边界,可千万不要小看这样的选择它会大大影响程序的可维护性和可复用性。

其实在Facade层来控制事务的边界通常都是最佳选择。我们知道Facade层的粗粒度接口是直接为用户请求提供相应服务的,在典型的J2EE环境中通常使用Session Bean来实现Facade层,并且使用CMT。这时如果有的开发人员在其他层次控制了事务如DAO,由于这些层次通常不会采用EJB实现,所以所使用的事务为容器提供的用户管理事务,根据EJB的事务规范CMT是无法把事务上下文传递到用户管理事务的边界中的,由于J2EE并不支持事务的嵌套,所以当来自Facade的CMT事务遇见DAO的事务时,内部事务将被挂起,这样整个事务的情况,就会和设想的业务逻辑产生很大的差异。

并且有时不同业务逻辑的实现会复用DAO提供多个方法,所以很难控制事务的边界,导致这些方法难以被复用。

对于Hibernate Session,由于存在懒加载的问题,所以开发人员常会预见这样的异常LazyInitializationException。避免这个问题就要求在关闭session前要装载好要使用的对象关系域。而这种逻辑通常只与界面显示内容相关,如果把session的边界控制放置在DAO或者Application Service中就会使业务逻辑的实现要和界面显示逻辑混合在一起,我们必须在这些方法中加载那些界面显示需要的对象关系域。而界面显示是经常变化的,并且业务逻辑会被多个不同的界面所复用,如果这样Application Service,DAO中方法的复用性就会大大降低。

把这些工作放在离表现层最近的Facade中便可以避免这些问题。

注意在其他层次中我们不需要控制session的边界,我们通常采用getCurrentSession()来获得当前事务中的session,记住这个方法必须在事务上下文存在的情况下才可以调用,并且在事务被提交的时候Hibernate会在自动关闭session,所以我们不要显示的关闭session.

posted on 2007-10-26 10:00 超越巅峰 阅读(1261) 评论(0)  编辑  收藏 所属分类: Java EE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值