精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-05-23
首先声明,我不会用lz提供的封装类。
也不用除spring以外的。 lz没看懂我的意思。 public class Logic { public void logicMethod1(){ addUser(user,false); addMenu(menu,false); } } 我只能在tomcat下用,没JTA,user表和menu表只在一个库内。 我想让它们在一个事务内。 spring能做,你的代码估计不行。 |
|
返回顶楼 | |
发表时间:2006-05-23
不敢当,我只是提供一个自己实际的应用供大家讨论,我觉得chenxu所提的dao的封装,也可以拓展到业务方法这一层地实现。我想这种设计的结构应该是一种完全面向接口的设计形式。当然也许还存在许多不足,但对于业务逻辑不是非常复杂的应用来说应该是一个不错的选择。本人经验有限,如有不对的地方请大家指正
|
|
返回顶楼 | |
发表时间:2006-05-23
zkj_beyond 写道 首先声明,我不会用lz提供的封装类。
也不用除spring以外的。 lz没看懂我的意思。 public class Logic { public void logicMethod1(){ addUser(user,false); addMenu(menu,false); } } 我只能在tomcat下用,没JTA,user表和menu表只在一个库内。 我想让它们在一个事务内。 spring能做,你的代码估计不行。 zkj_beyond,关于事务嵌套我刚才说的比较大概, 可以这样作 : DoHibernateProc_save dproc = new DoHibernateProc_save(new Object[] { userVo,menuVo}, true);{ //true代表此处使用hibernate事务 protected void defineProc(); throws HibernateException { User u = (User); objs[0]; s.save(u);; //精髓在于:使用匿名内部类让此两个操作位于一个事务中 MenuVo m = (MenuVo); objs[1]; s.save(m);; } }; dproc.doProc();; 总结一下,这种方法灵活轻巧,同时也不违背我刚才说的这种封装方式的好处: 它只需要调用简单的hibernate API save方法,无需处理hibernate异常和事务打开关闭的工作。因为在封装类DoHibernateProc_save 中已经完成了这些工作。 其实这也正是上面这位兄弟所说的那种spring也采用的方法! zkj_beyond兄,你觉得怎样呢? |
|
返回顶楼 | |
发表时间:2006-05-23
你提供的方法是可以的。但不幽雅。
只是有些业务逻辑可能会渗透到dao层。 spring提倡事务在logic层来处理,logic与dao层划分也比较严格。 另外spring提供的事务是可声明的。 其实你提供的方法和spring的封装最大的区别是,spring提供的DataSourceUtils,把数据库连接池独立出来了,并通过aop把操作拦截。你的把hibernate Session让外不可见的做法事务处理必须放到dao层。 我用spring并不在乎它提供的api复杂与否,inner class我也可以接受。 spring它提供我其它服务太好。ioc,aop,完美事务封装,严格的分层思想..... |
|
返回顶楼 | |
发表时间:2006-05-24
zkj_beyond 写道 你提供的方法是可以的。但不幽雅。
只是有些业务逻辑可能会渗透到dao层。 spring提倡事务在logic层来处理,logic与dao层划分也比较严格。 另外spring提供的事务是可声明的。 其实你提供的方法和spring的封装最大的区别是,spring提供的DataSourceUtils,把数据库连接池独立出来了,并通过aop把操作拦截。你的把hibernate Session让外不可见的做法事务处理必须放到dao层。 我用spring并不在乎它提供的api复杂与否,inner class我也可以接受。 spring它提供我其它服务太好。ioc,aop,完美事务封装,严格的分层思想..... 1、我在上面的这种实现方式是基于你的那几个假设: “我只能在tomcat下用,没JTA,user表和menu表只在一个库内。 我想让它们在一个事务内。 spring能做,你的代码估计不行。“ 我的答案只是对于你认为“你的代码在这种情况下估计不行”的一个回答,那并不代表我就赞成你说的所谓的 “不优雅”的实现方式。实际上你所认为的“优雅”的方式我也在我的前面贴中给出了答案。其实在这个答案中我正好使用的是JTA同时是在逻辑层中。和你spring是一样的,区别仅仅是spring可以通过aop实现声名式的事务。当然,仅仅一个设计思想肯定不可能和大名顶顶的spring框架比功能 。我也当然不是在和它比谁的功能更强大(我没有那么愚昧的 ),我只是在探讨另外一种设计方法而已。 当然,如果你非要让他具有声名式的事务的话,你自己使用aspectJ在logic层实现也无不可,和我的封装也不矛盾 。 2、再回过头来看我给你的答案,即便就这个答案本身来看它也并不是像你说的一定会造成业务逻辑侵入dao中。只要接口的粒度划分得当,一样的做到业务层和dao层划分明确 |
|
返回顶楼 | |
发表时间:2006-05-24
我没什么说的了。
可能我开始时就以为你要与spring pk. sorry. |
|
返回顶楼 | |
发表时间:2006-05-24
仅仅是讨论另一种设计方法?那就不用管他好不好了?
|
|
返回顶楼 | |
发表时间:2006-05-24
我不是这个意思,
设计方法当然本身也有好坏,我的意思只是说你可以拿它和其他东西比好坏,或者比某一点设计上的优越性高低,但是肯定不能拿来和其他某一个框架比功能上的多少! |
|
返回顶楼 | |
发表时间:2006-05-31
上面的“在DAO中对Hibernate进行封装(新)”这个方法可以写在一个接口里面,然后DAO实现这个接口,实现的方式是多样的,你可以在DAO里面得到连接,也可以用专门的管理类得到连接,这个都没有局限性的。老外提出的概念仅仅是概念而已,也就是老外提供了一个思维上的接口,怎么实现在于我们自己,这个没有一个具体的标准的。只要是代码方便使用,就是好的设计架构。
|
|
返回顶楼 | |
发表时间:2006-06-01
zkj_beyond 写道 我没什么说的了。
可能我开始时就以为你要与spring pk. sorry. pk 这个词, I like |
|
返回顶楼 | |