当前位置: 首页 > 知识库问答 >
问题:

我应该在哪里实现mvc架构(Spring hiberNate)中的特定查询?

南门鸿振
2023-03-14

我正在使用Spring mvc和hibernate实现一个企业应用程序。应用程序体系结构由以下层组成:

  • 查看
  • 控制器
  • 服务
  • Peristence公司

数据访问是使用经典的 dao 模式实现的,并允许 CRUD 操作泛型查询。我应该在哪里实现特定查询?我想有两种解决方案:

  • 通过创建Hibernate条件并将其传递给持久层来实现服务层中的特定查询
  • 通过为每个查询创建一个函数并调用服务层中的函数来实现DAO类中的特定查询。

我该怎么办?有更好的解决方案吗?

共有3个答案

邢臻
2023-03-14

这个:

  • 通过为每个查询创建一个函数并调用服务层中的函数来实现DAO类中的特定查询。

DAO 是“数据访问对象”的简写,使用 DAO 模式的不良原因之一是遵守“单一责任原则”。如果你的代码中还有其他一些类,除了处理数据访问的DAO类之外,那么你就违反了SRP,使用DAO模式或多或少成为一个有争议的问题。

更重要的是,出于可维护性的目的,如果其他开发人员稍后要维护您的代码,并且他们看到一堆DAO类,他们不会期望数据访问发生在其他任何地方。

您的服务层甚至不应该依赖于 Hibernate。你为什么会这样?你的服务层应该只依赖于你的域层,而域层又取决于你的持久层,这是你的Hibernate依赖应该在哪里,

章绪
2023-03-14

从分层架构的角度来看,sql查询不应该在DAO层之外使用/声明。您可能已经注意到,spring选择在服务层使用事务,因为事务不是DAO的责任,您也可以将其称为资源泄漏/横切关注点。在Dao之外声明/使用sql查询将被认为是资源泄漏/横切关注点。

自从您触摸Hibernate和标准 API 以来,我想添加一些东西。当您使用条件时,为什么需要单独的查询?标准 API 是实现持久性的一种优雅方式,因为它是完美的 OO 方法。

葛永丰
2023-03-14

服务层是业务层,不能使用任何持久性提供程序相关的接口和类(即Hibernate Criteria API)。这是一个很好的实践——您可以在不接触服务层中的任何代码行的情况下更改持久性提供程序。

不要犹豫,选择你的第二个选项(在 DAO 类中实现特定的查询)。

或者,您可以使用一种业务动态查询模式,它是查询和构建器模式的混合(如CriteriaAPI)。下面是一个简单的例子:

interface CarQuery {
    CarQuery model(String model);
    CarQuery color(String color);
    List<CarQuery> execute(); 
}
....
List<Car> cars = carDao.getQuery().model("Jeep").color("green").execute();
....

您可以在内部实现HibernateCarQuery,它可以使用HiberNate标准API。这肯定需要一些额外的努力,但如果您计划广泛使用特定方法并需要动态构建查询的能力,则不会用特定方法污染您的daos(典型情况是UI页面上的多个过滤器)。

 类似资料:
  • 我搜索了很多,几乎所有我发现的例子都使用了控制器中的异常处理和自己的异常处理程序。我一直认为这应该在程序的服务层上完成。如果不是,我真的不明白为什么要创建单独的服务层。 另外,如果我在Controller中实现异常处理,是否意味着我必须在前面的所有层中抛出异常?

  • 问题内容: 来自代码标题的问题: 与 问题答案: 来自http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html Spring团队的建议是,您只应使用注释对具体的类进行注释,而不是对接口进行注释。您当然可以将注释放置在接口(或接口方法)上,但这仅在您使用基于接口的代理时才能按预期使用。注解 未继承 的事实意

  • MVC中DTO转换应该在哪里进行? 我正在使用JPA。从控制器接收DTO作为参数。 此时,是否需要在控制器中转换它并将其传递给服务? 或者,我想知道服务是否接收DTO并转换它。

  • 问题内容: 我在ASP.Net中有一个WebAPI 2.0项目,在其中实现了自定义的DefaultContractResolver,以便可以控制如何使用JSON.Net将实体序列化为JSON。但是我不确定如何告诉框架使用我的自定义实现。我也想知道是否有可能更改特定控制器/动作的ContractResolver。 谢谢! -–编辑03/07/2014我已经通过创建一个新的ConfigSettings

  • 我正在尝试为没有它们的包装提供类型: 我在带有打字稿 2.4.2 的 webpack 中使用 ts-loader,并且在 tsconfig.json 中设置了以下类型根: 我试图模仿: < code>index.d.ts中包含以下内容: 但是错误仍然存在。我做错了什么?我应该把那些自定义的. d.ts文件放在哪里? 和任何其他类型根之间有什么区别?为什么TypeScript会区别对待它们?