锁定老帖子 主题:讨论:在DAO中对Hibernate的封装
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2003-10-13
随便说几句:
Session的透明化管理其实也并不麻烦,很简单的。 写一个Singleton结合ThreadLocal模式的类来获得Session。DAO接口实现类就调用该类获得Session。用完之后也不用关闭。 如果是在简单的非EJB应用中,在Servlet Filter里面提交事务,关闭Session。如果是在EJB应用中,在Session Facade里面手工关闭Session,或者写一个基类进行关闭,其它类继承它 (又或者可以写到ejbRemove方法里面去,让它自动去关闭,不知道行不行,没有试过) 总之是很容易做到,在程序里面,不管是Web层也好,业务层也好,还是持久层也好,写代码的时候完全不需要去管Session的创建和关闭问题。 |
|
返回顶楼 | |
发表时间:2003-10-13
按照我的理解,J2EE不同层有不同的数据表示方式
Web层: FormBean 业务层: VO 持久层: PO DAO是业务层和持久的层的分界线,Action是Web层和业务层的分界线,而不同层之间的数据结构的转换就是在分界线进行的。 传统来说,PO是不应该直接传递给业务层来使用的,例如Entity Bean,就必须构造VO返回给业务层,又或者是JDO,PO还不能脱离PM存在,也需要构造VO返回给业务层。Hibernate相对比较灵活,PO可以脱离Session,也可以修改之后在另一个Session中进行状态管理,因此PO可以充当VO来用,不顾并不意味着可以把PO和VO混为一谈。 FormBean和VO的转换我另一个帖子谈的比较详细。 |
|
返回顶楼 | |
发表时间:2003-10-13
to robbin,可否画个类图来表示一下你使用DAO的逻辑关系。(及你使用DAO的逻辑关系)
//下面列出的自己认为的逻辑关系(注意:还没有用在项目里面,对不对还希大家发表意见)。 觉得可以把它分为几层(): !--mdao2-- -mdao2Impl-hibernate--db 客户端--controlDAO---mdao1----mdao1Impl-hibernate-db !--mdao3----mdao3Impl-hibernate--db controlDAO:主要作一些公共的操作,如用户验证。过滤操作等。也可以用SB代替。这样的话就可以在jboss中发布(怎么样在jboss中单独使用hibernate还没试过,好像是要用到jms技术把hibernate当作一个服务然后才能让客户端通过lookup调用到) mdao2,mdao1,mdao3分别代表各个需要编辑的程序模块,是接口。具体任务从客户端分发下来以后由controlDAO决定到这里的那个模块。根据需要还可以加mdao4,mdao5..... mdao1Impl,mdao2Impl ,mdao3Impl 是上面接口的实现,具体实现业务逻辑,并参与hibernate的调用。在这些程序实现的代码里面完成与hiber的调用。 至于模块之间的联系,同样可以在它们之间加入dao来完成。 |
|
返回顶楼 | |
发表时间:2003-10-13
用hibernate,还有必要要vo吗?
从理论上讲,用是应该用vo的, 但是,实际上,po<-->vo的转换比较麻烦,特别是po跟po间又有很多关系的时候。 |
|
返回顶楼 | |
发表时间:2003-10-13
你说的vo指的是什么?
你的文章说了vo--po: http://forum.hibernate.org.cn/viewtopic.php?t=505&highlight=VO 不知可否详细讲解一下vo和po的概念: 链接给个也可以 |
|
返回顶楼 | |
发表时间:2003-10-13
http://forum.hibernate.org.cn/viewtopic.php?t=627
VO和PO在概念上差很多,VO的生命周期是用JVM来管理的,通过new创建,通过GC回收,而PO的生命周期是间接由数据库来管理的,是insert的时候创建,delete的时候消失。 通常意义上,在Hibernate中,由于PO自身实现非常灵活,基本上可以认为 PO == VO,不过在某些场合,还是有些细微差别的,特别是在有关涉及到那种持久对象的组合关系的关联处理的时候,还是有明显不同的。所以从概念上区分清楚,编程的时候不容易出错。 |
|
返回顶楼 | |
发表时间:2003-10-13
robbin 写道 http://forum.hibernate.org.cn/viewtopic.php?t=627
thanks |
|
返回顶楼 | |
发表时间:2003-10-13
oboooa 写道 但是就算Session方面没有大碍,对SessionFactory又怎么办呢?你每个原子操作都会去buildSessionFactory()一下吗?SessionFactory总应该共享于整个应用吧。它都不应该提倡用ThreadLocal来解决。SessionFactory总会在Dao之外.......
SessionFactory会在Dao之外,Session就会在Dao之外了,除非把SessionFactory传入Dao里,这又是向Dao传入对象的问题。 SessionFactory肯定是在DAO之外的,SessionFactory是一种服务器提供的资源,你可以把它当成DataSource来看,你不需要每次都去build DataSource吧。 SessionFactory除了可以配置到JNDI上来用(这种情况更类似DataSource),也可以写一个Singleton模式的SessionFactory的Factory,论坛前面应该有贴过实现代码的。 |
|
返回顶楼 | |
发表时间:2003-10-13
DAO只是封装了原子操作,也就是说,如果从hibernate1.2转到2.0,只改变DAO实现的话,其实与我直接修改session bean实现的工作量是一样的。因为我们在外面还有delegate,加上struts还有Action、formbean,如果再加一层DAO,觉得层次太多。当然,如果服务器不支持EJB,呵呵,那就要用DAO了。另外我不明白,1.2和2.0的接口为何差别这么大,连包名都换掉了,如果再过多两个版本,连save都变成create之类,就很郁闷了。
|
|
返回顶楼 | |
发表时间:2003-10-13
如果JDO2.0规范能够让Gavin King 感到满意的话,那么Hibernate兼容JDO是势在必行的,所以大家还是尽量用DAO吧,以免以后API再改一次。
|
|
返回顶楼 | |