【问题标题】:Can DAO's hold state informationDAO 可以持有状态信息吗
【发布时间】:2013-04-11 11:11:04
【问题描述】:

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

public class CustomerDAO extends CommonDAO{

private String txnid;
private String txnName;

getters....setters..
}

【问题讨论】:

    标签: java jakarta-ee design-patterns


    【解决方案1】:

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

    所以我会反过来问这个问题 - DAO 可以拥有什么样的合理状态?

    【讨论】:

    • 我来自哪里,我有一个非常具体的场景,为了向查询提供输入参数,需要更改多个 DAO 方法,此时我试图避免。所以我只是想知道我是否可以将这些输入保存在 ThreadLocal 变量中,但不知道最佳实践是怎么说的。我知道这听起来像是一个糟糕的设计,必须深思熟虑。
    • @hakish - 这听起来像是 DAO 正在使用 Builder pattern 创建查询,就像 EntityManager 一样。为了保持关注点的清晰分离,我会将有状态查询构建部分提取到它自己的有状态类中,然后将结果传递给 DAO,或者通过创建需要创建查询所需的完整数据的方法将 DAO 重构为无状态.如果这导致方法参数过多,可以将它们封装在Predicates 或类似的新类型中。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      DAO 通常在 singleton pattern 之后实现 - 这意味着每个实体只有一个 DAO 实例,因此状态信息将在使用 DAO 的应用程序的所有部分之间共享

      【讨论】:

        猜你喜欢
        • 2012-02-17
        • 2018-11-05
        • 1970-01-01
        • 1970-01-01
        • 2012-01-25
        • 2021-08-19
        • 1970-01-01
        • 2011-04-25
        相关资源
        最近更新 更多