简单说两句关于DAO的看法。

[复制链接]
查看11 | 回复1 | 2007-10-20 08:38:44 | 显示全部楼层 |阅读模式
我觉得如果对Persistent的理解已经到了JPA的时代,那么DAO是不需要的,甚至是不能要的。
先说为什么不需要。
持久的目的是什么?是存储对象的瞬时状态。将其简单理解为对数据库的CRUD是比较狭隘的。如果,内存足够大、计算机永远不会断电,程序员永远不反错误,那么可以不去持久化。
以JPA(Hibernate)的观点来看,一个对象只有两种状态:持久的和非持久的。让一个非持久的对象变为持久对象只需调用persist ()方法将其加入持久域;让一个持久的对象变为持久对象则调用remove()方法使其脱离持久域;如果让一个持久对象刷新其状态就调用flush()方法;如果想undo那么就refresh()。至于那些烦人琐事,让Hibernate那个倒霉蛋去干吧。事情就是这么简单。
如果看透了这一点,那么DAO就可以去光荣下岗了。
再说为什么不能要。
这个解释起来很简单,看看代码就知道了。
Java代码
public class Person {
private int id;
private List things;
...
}
public class Something{
private int id;
private Person owner;
private String name;
...
}
public class Person {
private int id;
private List things;
...
}
public class Something{
private int id;
private Person owner;
private String name;
...
}
很简单的一对多关联,与之对应有了PersonDao和SomethingDao,它们是的实现类中用Hibernate完成CRUD。
来看看“R”吧,它就是把DAO送进坟墓的人。
Java代码
public void doSomething() {
Person me = personDao.get(myId);
//我可以这样做吗?
List myThings= person.getThings();
//还是要这样做?
myThings = somethingDao.getThingsOf(me);
}
public void doSomething() {
Person me = personDao.get(myId);
//我可以这样做吗?
List myThings= person.getThings();
//还是要这样做?
myThings = somethingDao.getThingsOf(me);
}
如果你不想在Hibernate一棵树上吊死,那么就用JPA吧。如果你也不想在JPA上吊死那就自己定义一个XXXPA也可以。不过,在这之前,先认真地想一想你所知道的软件的生命周期内是不是真的会换掉Hibernate呢?
回复

使用道具 举报

千问 | 2007-10-20 08:38:44 | 显示全部楼层
看不明白你说的东西。你说Dao不应该存在了,但是根本没给出一个解决方案,哪怕是一个没有任何可行性的方案。我不能从你的代码中看到任何有新意的东西。
难道你认为把myThings = somethingDao.getThingsOf(me);变成List myThings = person.getThings();就可以消灭Dao了?
滑稽。
这两种读取方法虽然有些不一样,但是你这么写的前提是至少还有一个PersonDao。先读取用户,然后用Hibernate自动加载属性对象功能读取Something列表。这有什么新意?如果你只有Something的id呢?你最后还不是需要一个SomethingDao?
Dao不是这么消灭的。无论如何,也会有这么一个封装持久化操作的对象存在。也许日后会用AOP的方式让程序员看不见,不用自己写。但是你不能说它不存在。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行