2013-04-11 72 views
1

这可能听起来有点平凡,有人可以告诉我,如果有任何好的做法,说DAO的不应该存储状态信息,即非静态非最终成员变量?我所遇到的大多数DAO主要只包含静态变量和最终变量。可以DAO的保持状态信息

public class CustomerDAO extends CommonDAO{ 

private String txnid; 
private String txnName; 

getters....setters.. 
} 

回答

6

对我来说,DAO是“只是一个管道”,用于封装数据库通信。它构造并执行查询或/和代理EntityManager,因此至少对于JPA,除了EntityManager实例外,不需要任何状态。查询不直接依赖于对方。

所以我会用另一种方式提出问题 - DAO有什么合理的状态?

+0

我在哪里从快到共享,我有一个非常具体的情况,为了向查询提供输入参数需要更改多个DAO方法,而这些方法目前我正在尝试避免。所以我只是想知道我是否可以在ThreadLocal变量中保留这些输入,但并不知道最佳实践说的是什么。我知道这听起来像一个糟糕的设计必须考虑。 – hakish 2013-04-12 06:49:55

+0

@hakish - 这听起来像DAO使用[Builder模式](http://en.wikipedia.org/wiki/Builder_pattern)创建查询,就像'EntityManager'一样。为了保持清晰的关注点,我将有状态的查询构建部分提取到它自己的有状态类中,然后将结果传递给DAO,或者通过创建需要创建查询所需的完整数据的方法来重构DAO以使其无状态。如果这导致太多的方法参数,它们可以封装在一个新的类型中,比如'Predicates'或类似的。 – kostja 2013-04-12 08:19:07

2

强烈的否定:DAO存在的全部原因是提供无状态的数据库访问方法。阅读代码的大多数开发人员会很惊讶地发现任何状态。

此外,你所说明的状态不是线程安全的 - 你可能陷入正确的混乱中,做这种事情。

0

的DAO通常执行以下的singleton pattern - 这意味着只有一个DAO为每一个实体的情况下,这样的状态信息将应用程序的所有部分中使用DAO