多层结构是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