我正在使用休眠。问题在底部。
目前的策略
这很简单。
首先,我有一个基本的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
- 如果出现 a
DaoBook
,这个结构就会过时。
所以我变成Dao<T>
了一个抽象类,继续重构旧代码。
问题
为了Dao<T>
从代码库中删除引用,我想到了两种方法:
- 为每个需要附加的类创建特定的 DAO,这将生成许多几乎为空
DaoBook
的 s 和排序。 - 创建一个拥有 a
Dao<Object>
并仅公开附件方法(即save()
等update()
)的类。
我倾向于使用#2,但我认为这种“ AttacherDao
”模式可能很糟糕,所以我想听听你的意见。
#2有什么缺点吗?另外,你觉得“当前策略”有什么问题吗?