May Service注释类在spring框架中包含SQL / HQL吗?

时间:2012-10-27 14:47:24

标签: java spring

我检查了很多样本​​,但我没有找到适当的解决方案。 有些文档说“理想情况下,您的业务逻辑层不应该知道有数据库。它不应该知道连接字符串或SQL。”

我找到了一些样本,它们将业务逻辑定位到@Service注释类,但它们在@Service方法中使用SQL / HQL。

理想用法应该是什么?如果我们想要更改数据库或持久性技术,我们是否应该仅更改@Repository注释类或它们两者?

3 个答案:

答案 0 :(得分:2)

在您的服务方法中,您不应使用任何SQL / HQL语法或任何数据库工作。所有这些都应该在DAO层中,注释为@Repository。您应该从您的服务方法中调用它们。通过这种方式,您可以在将来轻松更改数据库。否则,它会有太多的负担

答案 1 :(得分:2)

我更喜欢将所有与持久性相关的东西(即查询,以及处理JDBC,JPA或Hibernate的所有内容)放在DAO层中,并让服务层依赖此DAO层来处理与持久性相关的内容。

但主要目标是不能在不影响服务层的情况下更改持久性技术。例如,如果从Hibernate切换到JPA,那么这是可能的,例如,如果从JPA切换到JDBC,那就不可能了。原因是

  • JPA会自动保留对实体所做的所有更改,而不需要更新数据库查询,而JDBC则不会,因此需要其他更新查询
  • JPA延迟加载实体之间的关联,而JDBC没有
  • ...

因此,更改持久性技术将影响服务层,即使所有持久性内容在DAO中都是隔离的。

这种脱钩的主要优点,恕我直言

  • 每个班级的责任更清晰。它避免了将与持久性相关的代码与业务逻辑代码混合在一起。
  • 可测试性:您可以通过模拟DAO层轻松测试服务层。您可以轻松地测试DAO层,因为它所做的就是对数据库执行查询。

答案 2 :(得分:2)

理想情况下,您的业务逻辑处理或构建域的对象或由其组成。它不应该意识到持久性等问题。这就像O / R-Mapper就像hibernate一样。业务逻辑需要基于域属性(如员工姓名,上个月的收入......)所需的对象。

持久层应该能够将业务需求转换为SQL / HQL / Service调用或所使用的技术。因此,业务逻辑层仅在业务逻辑发生更改时才会更改。

这将是理想世界的目标,但实际上它不适用于非平凡的问题。你无法避免某种程度的耦合。但正如@JB Nizet所说,将耦合减少到合理数量是值得的。使用TDD并遵守SRP等OO原则将帮助您实现目标。