Hibernate 中的通用 DAO 模式

2024-01-12

在处理 Hibernate 时,我们遵循 Hibernate Doc 中提到的通用 Hibernate DAO 模式。

因此,我们目前正在维护两个并行的层次结构 1) 对于接口 2) 实施

因此,如果我们以这种方式工作,即使除了标准持久性方法之外没有提出新方法,我们也需要为该条目及其实现创建一个标记接口。

尽管这种方法及其明确的分离似乎没有问题。

我的问题是是否有更好的方法/替代方法来实现这一目标

提前致谢


Umesh 我将向您展示我们如何实现此功能

界面

public interface Repository<INSTANCE_CLASS, PRIMARY_KEY_CLASS> {

    void add(INSTANCE_CLASS instance);
    void merge(INSTANCE_CLASS instance);
    void remove(PRIMARY_KEY_CLASS id);
    INSTANCE_CLASS findById(PRIMARY_KEY_CLASS id);
    INSTANCE_CLASS findById(PRIMARY_KEY_CLASS id, Class fetchingStrategy, Object... args);
    List<INSTANCE_CLASS> findAll();
    List<INSTANCE_CLASS> findAll(Class fetchingStrategy, Object... args);
    List<INSTANCE_CLASS> findAll(int pageNumber, int pageSize);
    List<INSTANCE_CLASS> findAll(int pageNumber, int pageSize, Class fetchingStrategy, Object... args);
    List<INSTANCE_CLASS> findAllByCriteria(Criteria criteria);
    List<INSTANCE_CLASS> findAllByCriteria(Criteria criteria, Class fetchingStrategy, Object... args);
    List<INSTANCE_CLASS> findAllByCriteria(int pageNumber, int pageSize, Criteria criteria);
    List<INSTANCE_CLASS> findAllByCriteria(int pageNumber, int pageSize, Criteria criteria, Class fetchingStrategy, Object... args);

}

因为您通常不需要上面显示的所有方法,所以我们创建一个抽象类目的是作为一个虚拟实现

public abstract class AbstractRepository<INSTANCE_CLASS, PRIMARY_KEY_CLASS> implements Repository<INSTANCE_CLASS, PRIMARY_KEY_CLASS> {

    public void add(INSTANCE_CLASS instance) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void merge(INSTANCE_CLASS instance) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public void remove(PRIMARY_KEY_CLASS id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }


    public INSTANCE_CLASS findById(PRIMARY_KEY_CLASS id) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public INSTANCE_CLASS findById(PRIMARY_KEY_CLASS id, Class fetchingStrategy, Object... args) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<INSTANCE_CLASS> findAll() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<INSTANCE_CLASS> findAll(Class fetchingStrategy, Object... args) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<INSTANCE_CLASS> findAll(int pageNumber, int pageSize) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<INSTANCE_CLASS> findAll(int pageNumber, int pageSize, Class fetchingStrategy, Object... args) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<INSTANCE_CLASS> findAllByCriteria(Criteria criteria) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<INSTANCE_CLASS> findAllByCriteria(Criteria criteria, Class fetchingStrategy, Object... args) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<INSTANCE_CLASS> findAllByCriteria(int pageNumber, int pageSize, Criteria criteria) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<INSTANCE_CLASS> findAllByCriteria(int pageNumber, int pageSize, Criteria criteria, Class fetchingStrategy, Object... args) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

}

现在,例如,如果您想要一个只需要添加方法的存储库,您可以使用

public class PersonRepository extends AbstractRepository<Person, Integer> {

    public void add(Person instance) {
        /**
          * person implmentatiuon goes here
          */    
    }

}

如果其他开发人员尝试访问除添加方法之外的方法,他或她将得到不支持的操作异常

标准只是一个标记接口.

public interface Criteria {}

一些方法的目的是定义一个参数类fetchingStrategy是匹配外部化的命名查询。这样,我就避免了容易出错的手工编码字符串。例如,JSR-303 bean 验证使用此方法来验证groups的属性。看here http://download.oracle.com/javaee/6/api/javax/validation/Validator.html#validate%28T,%20java.lang.Class...%29

public class Person {
    public static interface PERSON_WITH_ADDRESS {}
}

externalize命名查询如下所示

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <query name="PERSON_WITH_ADDRESS">
        <![CDATA[
            from 
                Person p
            left join fetch 
                p.address
        ]]>
    </query>
</hibernate-mapping>

所以当我想检索所有有地址的人时,我打电话

PersonRepository<Person, Integer> respository ...

List<Person> personList = repository.findAll(PERSON_WITH_ADDRESS.class);

findAll 可以写成

public class PersonRepository extends AbstractRepository<Person, Integer> {

    List<Person> findAll(Class fetchingStrategy, Object... args) {
        if(fetchingStrategy.isAssignableFrom(PERSON_WITH_ADDRESS.class)) {
            sessionFactory.getCurrentSession()
                          .getNamedQuery(fetchingStrategy.getSimpleName())
                          .list();
        }

        throw new UnsupportedOperationException("Not supported yet.");
    }

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

Hibernate 中的通用 DAO 模式 的相关文章

随机推荐

  • HTML5 Canvas API - 用斜体格式化单个单词

    我在 HTML5 中使用 Canvas API 时遇到一个小问题 我有一个文本 必须在 html 页面的画布上显示 文本示例可以是 这是一个斜体单词 所以我要做的就是显示从数据库中获取的文本 但只将句子中的一个单词设为斜体 所以我必须像这样
  • 类没有指定表或表名,并且不继承自现有的表映射类

    当我尝试向 python flask 添加新表时 class UserRemap db Model name db Column db String 40 email db Column db String 255 password db
  • 如何使用插件内的视图文件覆盖 nopcommerce 视图文件?

    我试图覆盖位于以下位置的 nopcommerce 视图 Nop Admin Views Category Tree cshtml 我在插件文件夹中开发了一个视图 Views Misc Tree cshtml 我该怎么做 试试我写的这篇详细文
  • JSON如何反序列化日期时间并将UTC转换为指定时区?

    我想创建一个自定义 json 序列化程序 它将使用 dateTime 的对象与 UTC 进行转换 然后再转换回指定的时区 非本地 转换为 UTC 的示例是 MyObject stuff new MyObject stuff Date Dat
  • 从 JAR 文件加载属性 (java 1.6)

    我手动将属性文件注入 jar 内 如何从 java 1 7 之前的 jar 文件加载属性 我尝试了很多解决方法 但到目前为止没有任何效果 关于它有很多问题 但一切都集中在 java 1 7 的 ClassLoader 方法上 当类路径或 j
  • MissingMethodException:找不到方法:'布尔值

    帮助我在运行 ASP NET 项目时解决此错误 MissingMethodException Method not found Boolean Microsoft AspNetCore Cryptography UnsafeNativeMe
  • RichTextBox 在 Azure 上抛出 OutOfMemory

    我正在使用 RichTextBox 将 RTF 中的字符串转换为纯文本 使用这段代码 private string ConvertToText string rtf if string IsNullOrWhiteSpace rtf retu
  • Interface Builder 从目标继承模块选择了错误的目标

    我有一个包含三个方案的项目 Debug MyApp Beta MyApp MyApp 该项目具有三种配置 Debug Beta 和 AppStore 此外 每个目标都会构建各自的配置 当我在 Interface Builder 中使用自定义
  • jeromq 生产准备好了吗?

    我过去曾通过 JVM 应用程序使用 ZeroMQjzmq图书馆 我计划在一个新项目中使用 Zeromq 其中一些服务是在 JVM 上实现的 我刚刚发现jeromq https github com zeromq jeromq 一个 Zero
  • 面包屑微数据帮助

    我正在尝试帮助 Google 为我的网站生成适当的面包屑详细信息 我目前正在使用它作为面包屑 div span class crust a href http www radonsystems net class crumb span Ho
  • Git - 更改分支时文件会去哪里?

    刚刚开始学习 git 我喜欢它的概念 到目前为止 有一件事对我来说有点奇怪 我似乎无法在搜索中找到 当我打字时git checkout branchName要更改为我想要的任何分支 当我查看 Finder 窗口时 我可以根据我所在的分支直观
  • Kubernetes 部署与 StatefulSet

    我对 Kubernetes 做了很多挖掘 我很喜欢我所看到的 我一直无法清楚地了解的一件事是 Deployment 和 StatefulSet 资源之间的确切区别是什么 以及您将在哪些场景中使用它们 或者通常更喜欢其中一种 Deployme
  • 顺序对象是否由指定的 jQuery 选择器返回?

    所有 jQuery 选择器都会返回一个对象数组 这些对象的顺序是否始终与 HTML 中的顺序相同 我可以依靠这个吗 Yes The jQuery 1 3 2 发行说明 https blog jquery com 2009 02 20 jqu
  • 如何获得两个元素之间的距离(中点)?

    我需要你的帮助 我在它们之间放置了随机数量的 div div div class item Item description div div class item Item description div div class item It
  • Vim 突出显示 FORTRAN 中奇怪的部分

    我正在使用 VIM 主题 molokai 如果这有什么区别的话 我最近一直在学习 FORTRAN 当我使用 VIM 编写 FORTRAN 程序时 根据我的空白 我有奇怪的颜色 例如 如果我按原样 没有缩进 进行制表符 我只会在单词的一部分上
  • Enumerable.Range - 什么时候使用才有意义?

    编程时 几乎本能地决定何时使用 for 循环或 foreach 但是选择使用 Enumerable Range 的决定因素或问题空间是什么 A For Loop当我们想要迭代一定次数 通过简单的数据类型 来计算 执行重复任务时选择 A Fo
  • 在Java编译器中,哪种类型可以定义为标识符(ID)或关键字(保留字)?

    我有一个简单的问题 在Java编译器中 哪些类型的方法或变量可以被定义为标识符 ID 或关键字 保留字 对于以下示例 ID 应为 add main a b c Test1 关于什么print is printID 或关键字 Example
  • Postgres - 返回 2 个数组的交集的函数?

    在 postgresql 中 如果两个数组具有公共成员 即它们重叠 则可以使用 运算符返回 t true 是否有一个函数 运算符可以返回这些常见成员的内容 即像这样 select arrray intersection ARRAY 1 4
  • 如何从自定义发行版中采样?

    我有一个发行版的pdf 该分布不是标准分布 R 中不存在可从中采样的函数 如何使用 R 从此 pdf 中进行采样 这更多的是一个统计问题 因为它需要采样 但一般来说 您可以采用这种方法来解决问题 查找发行版f 其 pdf 当乘以任何给定常数
  • Hibernate 中的通用 DAO 模式

    在处理 Hibernate 时 我们遵循 Hibernate Doc 中提到的通用 Hibernate DAO 模式 因此 我们目前正在维护两个并行的层次结构 1 对于接口 2 实施 因此 如果我们以这种方式工作 即使除了标准持久性方法之外