我觉得如果对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呢?