存储库设计模式 - 每个 Dao 都应该有一个存储库吗?

2023-12-20

我的应用程序中有一些 DAO,它们访问数据库以进行 CRUD 操作。比如说新闻、天气和体育 DAO。所以我对需要多少个存储库感到困惑。我应该只使用一个存储库(例如 DataRepository)并让我保存我的数据库和所有 dao。并在其中封装CRUD操作的方法?或者每个 DAO 应该有自己的存储库?

我的意思是存储库应该只返回调用层可以理解的数据对象。所以它就像对 DAO 的封装,但我不确定是否应该为每个 DAO 创建一个,或者每个应用程序只有一个存储库,等等。

如果你读到这篇文章article http://hannesdorfmann.com/android/evolution-of-the-repository-pattern我们开始认识到该模式是过度设计或过度抽象的。它变成了隐藏细节与最小化查询语句。

但似乎每个 DAO 都应该有一个 Repo,因为界面本身如下所示:

interface Repository<T> {
void add(T item);
void remove(Specification specification);
List<T> query(Specification specification);

}

其中 T 可以是数据 DAO 访问的类型/表。现在只需要澄清。你能想象我有 30 种不同的类型,那么我需要 30 种不同的 Repo 实现吗?这是荒唐的。看起来存储库模式本身就像一个 DAO,没有什么不同。我很困惑。


我不确定这就是您所寻找的,但在我的应用程序中我正在使用描述的DAO图案与Spring

所以我对需要多少个存储库感到困惑。

恕我直言,每个实体至少需要一个存储库,因为它们会导致简单的设计,但由于您使它们通用并且它们处于层次结构中,因此可以简单地与子类/接口一起使用

下面是例子

定义常用基本方法的接口

public interface GenericDAO<T, ID extends Serializable> {


    T findById(ID id, LockModeType lock);

    void save(T entity);

    T update(T entity);

    List<T> findAll();
}

通用实施

public abstract class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> {

    @PersistenceContext
    protected EntityManager em;

    private final Class<T> entityClass;

    public GenericDAOImpl(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    @Override
    public T findById(ID id, LockModeType lock) {
        return em.find(entityClass, id, lock);
    }

    @Override
    public void save(T entity) {
        em.persist(entity);

    }

    @Override
    public T update(T entity) {
        return em.merge(entity);
    }

    @Override
    public List<T> findAll() {
        CriteriaQuery<T> c = em.getCriteriaBuilder().createQuery(entityClass);
        c.select(c.from(entityClass));
        return em.createQuery(c).getResultList();
    }
.
.
.
}

Foo类

@Entity
public class Foo implements Serializable {

    private static final long serialVersionUID = 1L;
    private Long id;
    private String text;
}

Foo 存储库

public interface FooRepositiry extends GenericDAO<Foo, Long> {

    Foo findTextById(Long id);

}

实施 Foo 存储库

@Transactional
@Repository
public class FooRepoImpl extends GenericDAOImpl<Foo, Long> implements FooRepositiry {

    public FooRepoImpl() {
        super(Foo.class);
    }

    @Override
    public Foo findTextById(Long id) {
        CriteriaQuery<Foo> c = em.getCriteriaBuilder().createQuery(Foo.class);
        // .
        // .
        // .
        return em.createQuery(c).getSingleResult();
    }

}

Bar 类也一样

@Transactional
@Repository
public class BarRepoImpl extends GenericDAOImpl<Bar, Long> implements BarRepo {

    public BarRepoImpl() {
        super(Bar.class);
    }

    @Override
    public List<Bar> findAllBarWithText(String text) {
        CriteriaQuery<Bar> c = em.getCriteriaBuilder().createQuery(Bar.class);
        return em.createQuery(c).getResultList();
    }
}

在这里,这个通用实现需要两个东西才能工作:一个 EntityManager 和一个 实体类。子类必须提供实体类作为构造函数参数。 EntityManager 是通过使用提供的PersistenceContext或者你可以使用getter-setter方法相同。自从GenericDAOImpl是抽象的,因此您不能直接使用它,而是间接使用它,并且大多数常用方法都是通用的并且处于层次结构中,这使得它们成为重用的理想候选者。

您可以从书中阅读更多相关内容Java 持久化与 Hibernate 第二版 https://www.manning.com/books/java-persistence-with-hibernate-second-edition

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

存储库设计模式 - 每个 Dao 都应该有一个存储库吗? 的相关文章

随机推荐

  • Qt 自 Xcode 8 起不再工作

    自从安装 Xcode 8 以来 我在创建 Qt 控制台项目时收到此错误 项目错误 Xcode 未正确设置 您可能需要通过运行 usr bin xcodebuild 来确认许可协议 我已经重新安装了 Qt 和 Qt Creator 我读过很多
  • 程序不等待用户使用 scanf("%c",&yn) 输入;

    这是我正在编写的程序的基本代码 用于练习使用 C 中的文件 我试图检测输出文件是否已经存在 如果确实存在 我想询问用户是否愿意覆盖它 这就是我首先使用 fopen outfilename r 打开 outfilename 文件的原因 与 f
  • 如何用更少的行编写这段 JavaScript 代码来查找一棵树是否是二叉搜索树?

    在我的 Javascript 类测验中 我们被告知要制作一个简单的树并编写一个返回 true 或 false 的函数 无论它是否是 BST 我的成绩还不错 但是我被扣了10分 因为老师说 可以少6行就完成 这就是我所拥有的 function
  • 使用 ("" + ) 转换为字符串是不好的做法吗?

    在Java中转换为String是使用
  • 在 Ruby 中比较两个包含字谜字符串的数组

    如果我的代码已关闭 请原谅我 我仍然对 Ruby on Rails 很感兴趣 随着我了解更多 只是 Ruby 似乎存在一些细微的差异 尽管公平地说 我不确定我的代码是否能通过 Ruby on Rails 格式的测试 我离题了 我正在尝试比较
  • AngulareJS e2e 检查列表中的每个链接

    我是 AngularJS 的新手 我将主要使用 e2e 部分 使用 jasmine 经过几天的无果而终 至少可以说 我发现文档相当厌食 我想知道是否有人可以在这里帮助我 网站生成 a href 链接的 html 列表 我可以使用 angul
  • kotlin 数据类 + bean 验证 jsr 303

    我正在尝试让 Kotlin 在 spring data rest 项目上使用 jsr 303 验证 给出以下数据类声明 Entity data class User Id GeneratedValue strategy javax pers
  • 如何在Android中正确使用Parcelable类

    我有一个类 如下 我想通过意图发送到服务类 我已经实现了 Parcelable 接口 但不确定如何实际发送和检索整个对象 包括对象的当前状态 尤其 Override public void writeToParcel Parcel dest
  • JPA:TypedQuery 有时返回 null 而不是 NoResultException

    通常我使用 NoResultException 返回一个 空 对象 例如如果我没有从 TypedQuery 中得到结果 则返回一个空错误列表或 new BigInteger 0 现在事实证明 这有时行不通 突然 getSingleResul
  • 使用 JBoss 将消息发布到远程 JMS 队列

    这看起来很简单 但我找不到简单的答案 我想打开到远程 JMS 代理的连接 IP 和端口已知 打开到特定队列 名称已知 的会话并向该队列发布消息 是否有任何简单的 Java API 如果可能的话 标准 可以做到这一点 EDIT 好吧 我现在明
  • 环境变量文件的命名约定?

    我只是想知道是否有任何标准化约定 env环境变量文件 如果我有多个设置 例如development staging production 它们的标题应该是什么 我见过 env development development env sett
  • 快速第 n 个孩子问题

    我有一个快 nth child我正在努力解决的问题 我的目标是形成一个列表的 4 个项目分组中的每第 3 个和第 4 个项目 例如 div class normal Item 1 div div class normal Item 2 di
  • 并行执行 DocumentDb 存储过程

    documentDb 存储过程可以并行运行并更新同一对象吗 documentDb 会按顺序处理它们吗 考虑以下场景 我有一个应用程序 当我的用户完成任务时 我可以赠送 10000 个硬币 我有以下对象 remainingPoints 100
  • swift 3 结合使用语音识别和 AVFoundation

    我成功地能够使用 Speech 语音识别 并且可以使用 AVFoundation 在 Xcode 8 IOS 10 中播放 wav 文件 我只是不能同时使用它们 我有工作语音识别代码 可以在其中导入语音 当我将 AVFoundation 导
  • XmlSerializer System.InvalidOperationException

    我的应用程序中有以下代码 Serializable public class Class private string name private List
  • 使用python从youtube抓取视频信息

    我想使用 python 提取某个 Youtube 视频的视频信息 如标题 观看者数量 就像我在其他网站上进行网页抓取一样 但由于某种原因 它要么不返回任何内容 要么只为侧面推荐的视频而不是 URL 的 主视频 提供标签 我尝试了与在其他网站
  • Git fork 版本礼仪 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 当我在 GitHub 上分叉别人的项目 更新文件并更新我自己的分叉时 如何对我的分叉进行版本控制 例如 原始项目是版本1 2 3 我添加了一个小
  • 如何使用 pytest 来断言不引发警告

    我想确保完全没有警告在一项断言中提出 找不到任何明确的答案关于警告的 pytest 文档 https docs pytest org en 3 2 1 warnings html assertwarnings 死链接 3 2 文档不再可用
  • Xlib:以最小化或最大化状态创建窗口

    是否可以使用 Xlib 创建最大化或最小化状态的窗口 如果是这样 我将如何去做呢 像这样的东西 XEvent xev Atom wm state XInternAtom dpy NET WM STATE False Atom max hor
  • 存储库设计模式 - 每个 Dao 都应该有一个存储库吗?

    我的应用程序中有一些 DAO 它们访问数据库以进行 CRUD 操作 比如说新闻 天气和体育 DAO 所以我对需要多少个存储库感到困惑 我应该只使用一个存储库 例如 DataRepository 并让我保存我的数据库和所有 dao 并在其中封