【发布时间】:2009-06-22 22:46:32
【问题描述】:
我正在使用休眠。问题在底部。
目前的策略
很简单。
首先,我有一个基本的Dao<T>。
public class Dao<T> {
private Class<T> persistentClass;
private Session session;
public Dao(Class<T> persistentClass) {
this.persistenClass = persistentClass;
this.session = HibernateUtil.getCurrentSession();
}
它作为一个基类很好,它将最常用的方法传递给它的Session。
public T get(Serializable id) {
@SuppressWarnings("unchecked")
T t = (T) this.session.get(this.persistentClass, id);
return t;
}
protected Criteria getCriteria() {
return this.session.createCriteria(this.persistentClass);
}
当需要对模型使用查询时,它会进入该模型的特定 DAO,该 DAO 继承自 Dao<T>。
public class DaoTask extends Dao<Task> {
public DaoTask() {
super(Task.class);
}
public List<Task> searchActiveTasks() {
@SuppressWarnings("unchecked")
List<Task> list = (List<Task>) this.getCriteria()
.add(Restrictions.eq("active", true))
.list();
return list;
}
}
这种方法一直很有效。
但是...
但是,今天我发现很多时候一个实例需要重新附加到Session 并且最终会发生类似于以下的一行:
new Dao<Book>(Book.class).update(book);
...我觉得这很糟糕,因为
- 我不喜欢指定多余的
Book.class - 如果出现
DaoBook,此构造将过时。
所以我把Dao<T>变成了一个抽象类,然后继续重构旧代码。
问题
为了从代码库中删除Dao<T> 引用,我想到了两种方法:
- 为每个需要附加的类创建特定的 DAO,这将生成许多几乎为空的
DaoBooks 和排序。 - 创建一个拥有
Dao<Object>并仅公开附件方法(即save()、update()等)的类。
我倾向于选择 #2,但我认为这种“AttacherDao”模式可能不好,所以我想听听您的意见。
#2 有什么缺点吗?另外,你觉得“当前的策略”有什么问题吗?
【问题讨论】: