0

我在互联网上看到了很多通用 dao 的用法。你一定会喜欢它:

public interface GenericDao <T, PK extends Serializable> {}

public class GenericDaoHibernateImpl <T, PK extends Serializable>
implements GenericDao<T, PK>

新班级出现了?没问题:

public interface NewClassDao extends GenericDao<NewClass, Long> 

我们都准备好了。

现在,如果我去“全通用”并做类似的事情有多糟糕:

public interface FullGenericDao 

public class FullGenericDaoHibernateImpl

现在我只能使用一个 DAO(带有强制转换的对象!)

新班级又出现了?没问题:

NewClassApperedAgain newClassAppeared = (NewClassApperedAgain) FullGenericDao.getItemById(20, NewClassApperedAgain.class);

想到两个问题:

1) 是否有可能“完全通用”并实际创建这样的 DAO?我的意思是我不明白为什么不为 dao 的每个方法传递 className 而只是进行必要的强制转换?保存(对象,类名);删除(对象,类名);ETC..

2)这种做法的缺点(我敢肯定有)是什么?

谢谢!

4

1 回答 1

1

DAO 对象包含与持久层连接的领域模型特定逻辑。

您可以完全通用,但是您必须面对以下问题:

  • 我应该将与搜索相关的逻辑放在哪里(例如构造 WHERE 子句)?
    • User findUserByOrganizationId(Serializable organizationId)
  • 我在哪里放置一些特定的映射函数(例如聚合查询)?
    • Map<Organization, Integer> findUserCountPerOrganization()

我很确定还有其他架构/逻辑问题。此外,泛型将在运行时被删除,因此您已经介绍了Class<?>在每个方法签名中包含域对象的必要性。

TL;DR可以“完全通用”,但您需要将非共享持久性逻辑移至更高级别。最好在一些中执行共享的通用逻辑,AbstractDaoImpl然后对其进行子类化。您最终可能会得到空的实现(通用超类可能拥有您所需要的一切),但您将拥有未来领域模型特定方法的位置。

于 2013-05-19T10:43:40.333 回答