将DAO与复合对象一起使用

时间:2012-09-09 12:55:04

标签: java database design-patterns

我试图在这里重写一堆DAO是设置:

  • 只有普通的JDBC(没有JPA,ORM无论如何)
  • 没有使用接口
  • 插入对象前的大量检查
  • 业务对象密切相关

我的主要问题是: 如何持久保存/检索由多个其他对象组成的业务对象? 例如我的CustomerDAO是否知道AddressDAO并从那里检索csutomers地址?

3 个答案:

答案 0 :(得分:1)

  

只有普通的JDBC(没有任何JPA,ORM)   业务对象密切相关

在您希望链接业务对象时,不确定为什么不想使用JPA,但至少应该使用Spring JDBC模板来减轻您的某些样板代码。

关于其他约束,我会按如下方式进行:

  1. 我仍然会使用接口来定义DAO方法,并在支持DAOImpl的Spring JDBC模板中实现它们。在任何地方使用DAO并注入DAOImpl。
  2. 我的DAO只是与基础表的一对一映射,每个DAO都不会知道其他DAO的存在。
  3. 我的Manager层将具有运行验证检查的所有业务逻辑,并准备需要持久化的对象集,调用适当的DAO和适当的方法(CREATE / UPDATE / DELETE)来持久保存对象。
  4. 同样,Manager层将遵循基于接口的实现,而视图层将使用ManagerImpls注入管理器类型。
  5. 我的两分钱!

答案 1 :(得分:0)

您可以考虑使用JOOQ。它不是JPA,但它可以很容易地用作替代解决方案。它足够轻巧。它还提供了一个反向工程工具,它将数据库实体构建为DAO对象。

我已经在相关的情况下嵌入了JOOQ,其中应用程序是经过精心设计的。我没有使用它的DAO功能,而是将其用作更高层,以避免弄乱JDBC层。

干杯!

答案 2 :(得分:0)

复合实体是DAO之上的一层。如果要删除所有耦合,DAO持久保存的域对象应该是平坦的,没有关系。请参阅Core J2EE模式CompositeEntity。

另外,最好不要在DAO之间引入耦合,将发现者放在另一个中。 E.g:

AddressDAO.findForCustomerId(ID);

不如使用第三个DAO来管理这种关系。即:

CustomerAddressRelDAO.findAddressForCustomer(ID);

如果您使用DAO关系,地址和客户都不会相互依赖(或了解)。