读书人

这段代码可不可以做成通用DAO?

发布时间: 2012-11-09 10:18:48 作者: rapoo

这段代码能否做成通用DAO???
前段时间在学习Hibernate,今天正式开始用,在用的过程中我为每个表(对象)做了一个DAO,主要用来实现增删改查,因为里面的很多的表(对象)需要写很多DAO,所以我就抽象了一个类,先前也没觉得怎么,不过到后来觉得我抽象出来的这个东西好象能通用吧... ...
现在拿出来让大家看看我这样抽象是否正确,是否对大家有点帮助...同时也希望它能完善...
自己只是简单的测了一下下


使用了Spring的Hibernate支持,怎么不用Spring的声明式事务管理?private Serializable save(Session session, Object p) 方法居然自己控制事务。但是其他方法又没有事务。到底事务控制是方应用层控制还是扔DAO里了?
还有public Serializable save2(final Object entity) throws DataAccessException 命名不科学。没人知道save2是什么意思。public int executeUpdate(final String hql)暴露了DAO实现,没有把领域层和持久化层隔离。而且这个方法会造成缓存失效,没有清理缓存的语句。 8 楼 star022 2008-04-08 movingboy 写道建议楼主搜索一下“泛型DAO”,或许会有收获
我做的项目重中,
就为公司写了一个泛型DAO,
所有表或者视图的基本操作全封装在里面了。 9 楼 jolestar 2008-04-08 恩。不用范型类型转换太麻烦,用范型,基本就需要一个DAO,别的具体操作可以方在Service层里。 10 楼 lsk 2008-04-08 魔力猫咪 写道
使用了Spring的Hibernate支持,怎么不用Spring的声明式事务管理?private Serializable save(Session session, Object p) 方法居然自己控制事务。但是其他方法又没有事务。到底事务控制是方应用层控制还是扔DAO里了?
还有public Serializable save2(final Object entity) throws DataAccessException 命名不科学。没人知道save2是什么意思。public int executeUpdate(final String hql)暴露了DAO实现,没有把领域层和持久化层隔离。而且这个方法会造成缓存失效,没有清理缓存的语句。

阁下果然眼明。 事务是在service层控制的.dao没有,至于哪个private Serializable save 和save2是是当初写这个dao的人加的。地层代码一般最好还是不要动。
至于public int executeUpdate(final String hql)这个还请你举个例子说明一下。 11 楼 SoldierBandit 2008-04-09 每个公司都不一样吧!像我们公司,就不用数据库的框架!呵呵 12 楼 xzy_del 2008-04-09 import java.io.Serializable;
public interface GenericDao<T,PK extends Serializable> {

PK create(T newInstance);

T read(PK id);

void update(T transientObject);

void delete(T persistentObject);
}
可以试试用泛型 13 楼 Joo 2008-04-09 jolestar 写道恩。不用范型类型转换太麻烦,用范型,基本就需要一个DAO,别的具体操作可以方在Service层里。

意思整个DAO层就一个DAO类就可以了
涉及到具体的不同类型查询操作一般写哪里?我原来的做法是每个EntityBean对应一个EntityDAO,有关她的持久层操作都在这里面,然后让他extends一个BaseDAO
14 楼 魔力猫咪 2008-04-09 引用 至于public int executeUpdate(final String hql)这个还请你举个例子说明一下。主要是你传入了HQL语句。HQL是Hibernate专有的语言,别的框架不支持这种语言。虽然JPA的查询语言和HQL基本差不多,但是还有可能在某些地方不一样。所以你这个方法就变成了只能Hibernate使用的专用方法。Service的使用者也就必须知道底层实现是Hibernate。造成了应用和持久化的紧耦合。
还有就是Update和Delete操作语句要小心,如果使用了Hibernate的二级缓存和查询缓存,那么Update和Delete使用的时候,必须清理缓存。你这里并没有缓存清理操作。除非你绝对不使用二级缓存,不然这么做是会出问题的。
我们封装的时候,对这些方面要考虑清楚。封装的方法不合适,不但不能很好解藕,反而给变成带来了麻烦。
我看到过一个Hibernate封装。好像是因为怕别人不会用Hibernate,在Dao里把Hibernate全给封起来了。连Session也拿不出来。但是传入的参数都是Hibernate专有的HQL语句。你说这算什么封装。最后弄得大家都不好干。 15 楼 terranhao 2008-04-11 不好意思,我从来都是直接用hibernate的语句增删改
我想问的是这种DAO方法到底好在哪里,他一条语句delete
我用session一样是一个delete,这种方法哪里好了?
我真的从来没用过DAO,请大家指教 16 楼 hysoft 2008-04-11 DAO 不参杂业务 只管数据操作

事务啥的放在service 17 楼 flustar 2008-04-11 这个是我写的泛型dao
看看对你是否有帮助
http://www.blogjava.net/flustar/archive/2007/12/26/ssha.html 18 楼 melin 2008-04-11 在liferay中大部分增删改的action是相同的,通过常量来判断Constants.CMD。来判断执行什么操作,service也类似。 19 楼 smallboy2008 2008-04-12 348105874 写道c,,u,d等方法最好不要混在一起
这点我同意
可以防止混乱 20 楼 ericxu131 2008-04-12 应该说范型dao是最好的解决方案了吧。
hibernate官网上有的。 21 楼 spiritfrog 2008-04-13 魔力猫咪 写道引用 至于public int executeUpdate(final String hql)这个还请你举个例子说明一下。主要是你传入了HQL语句。HQL是Hibernate专有的语言,别的框架不支持这种语言。虽然JPA的查询语言和HQL基本差不多,但是还有可能在某些地方不一样。所以你这个方法就变成了只能Hibernate使用的专用方法。Service的使用者也就必须知道底层实现是Hibernate。造成了应用和持久化的紧耦合。
还有就是Update和Delete操作语句要小心,如果使用了Hibernate的二级缓存和查询缓存,那么Update和Delete使用的时候,必须清理缓存。你这里并没有缓存清理操作。除非你绝对不使用二级缓存,不然这么做是会出问题的。
我们封装的时候,对这些方面要考虑清楚。
public int executeUpdate(final String hql);对于这种方式,我觉得还是没问题的,不会又用hibernate又用jpa的吧;
对于这个方法对二级缓存的影响,确实需要注意。
lz的dao可以考虑用范型的,这样子类dao将明确知道对应的实体类型,返回时候也不必转型了。另外,不要将crud搞成一个方法,反倒迷惑了调用者。
再有lsk的那个通用dao确实挺全的,呵呵。

22 楼 liuxin0448 2008-04-17 请问各位大侠
Constants.MAXRESULT
是那个包下的Class
在这里又起什么作用呢~!
23 楼 CALM 2008-08-05 魔力猫咪 写道public boolean idu(char t)这个方法严重有问题。为什么要把增删改用这个间接实现?查询方法也一样。头一次看见这么写的。而且方法传入的那几个char也没有做静态属性,别人不知道你源代码的情况下谁知道应该往里头传什么。增删改方法如果一个请求内多次调用,每次都要提交一次,等于实际上没有事务控制。如果中间操作出错,事务原子性根本无法保证。建议你去看看Spring的HibernateSupper。
这是什么? 24 楼 kjj 2008-08-06 以前就是由于这种写法粘连性太强,为了清晰解耦才把方法清晰划分出来,你这 ....... 唉,我都不好意思说什么了,如果你才学习的话倒也情有可原....... 25 楼 slaser 2008-08-07 其实有了hibernate,dao还有什么用?

读书人网 >软件架构设计

热点推荐