【问题标题】:Generic DAO disadvantages?通用 DAO 的缺点?
【发布时间】:2012-12-28 17:01:43
【问题描述】:

我想为我的应用程序创建一个 DAO 层。经过一番谷歌搜索,我发现很多人使用通用 DAO 方法 (Don't repeat the DAO!)。

但我不喜欢这种方法。

如果我需要不同 DAO 实现的 DAO 之间的接口略有不同怎么办? (即通用接口中的方法与我想在我的 DAO 实现中创建的方法不完全相同)

如果我的实体的主键包含多个属性怎么办?

【问题讨论】:

  • 根据“主要”一词的定义。只能有一个“主”键。

标签: java design-patterns dao


【解决方案1】:

如果您需要为特定实体稍微不同的 DAO,您始终可以扩展一个通用的 (MySpecificDAO <....> extends GenericDAO<....>)。主键本身可以是复合的,但不可能有 2 个主键。

【讨论】:

    【解决方案2】:

    直接来自您链接到的文章:

    扩展 GenericDAO

    每个 DAO 的接口当然是基于 GenericDao 接口的。我只需要将接口调整为特定的域类并将其扩展为包含我的查找器方法。在清单 6 中,您可以看到为特定目的扩展的 GenericDao 接口示例

    关于你的最后一个问题:根据定义,一个实体只有一个主键。

    【讨论】:

      【解决方案3】:

      缺点:你仍然需要实现 DAO。停止遵循 6 年前的建议,改用 Spring Data repositories。那么你根本不需要编写任何实现。

      【讨论】:

        【解决方案4】:

        如果我需要不同的 DAO 之间的接口略有不同怎么办? DAO 实现?

        您可以覆盖 GenericDaoImpl 类中的方法。或创建一个新方法。

        如果我的实体有 2 个或更多主键怎么办?

        我猜你的意思是复合键场景。注意,GenericDao 中的 findOne/readOne/getOne 方法通常需要一个参数,(T key) 这里的 T 是类型,可以是复合主键。

        例如:

        class PersonPK{
         private String name;
         private Date birthday;
        .....
        }
        

        【讨论】:

          【解决方案5】:

          您可以找到here a Generic DAO 对该文章的有效和改进实现。只需查看页面底部的Example.java。在此示例中,您可以看到如何为不同的 DAO 定义“DAO 之间的略有不同的接口” 实现”。

          【讨论】:

            猜你喜欢
            • 2016-03-26
            • 2010-12-17
            • 1970-01-01
            • 2015-08-08
            • 1970-01-01
            • 2011-02-20
            • 1970-01-01
            • 2013-05-18
            • 2018-08-25
            相关资源
            最近更新 更多