在DAO,服务层架构中使用spring MVC和Hibernate的正确方法是啥
Posted
技术标签:
【中文标题】在DAO,服务层架构中使用spring MVC和Hibernate的正确方法是啥【英文标题】:What is the right way to use spring MVC with Hibernate in DAO, service layer architecture在DAO,服务层架构中使用spring MVC和Hibernate的正确方法是什么 【发布时间】:2012-02-18 01:58:50 【问题描述】:我在我的 DAO 类中使用带有 Hibernatedaosupport
的 Spring MVC。搞不清楚从哪里开始事务,到底应该在服务层还是DAO层?
我的视图与服务层交互。 DAO 被注入到服务中。
在DAO、服务层架构中使用Spring MVC和Hibernate的正确方法是什么?
【问题讨论】:
@JustinThomas 这很有帮助,但又有所不同。 【参考方案1】:恕我直言,交易应该转到服务层。通常,一项业务事务由多个查询和更新组成。如果你把@Transactional
只放在DAO层,每个查询和更新都会在一个单独的事务中运行,这实际上违背了事务的目的。
但是如果服务是@Transactional
,每个数据库交互都会加入一个在web层进入服务层时启动的主事务。请注意,在这种情况下,如果 Web 层运行多个服务方法,它们中的每一个都将在单独的事务中运行(同样的问题上移一级)。但是将@Transactional
放在 web 层可能会引入意想不到的副作用,例如 N+1 问题,否则会被捕获。因此尝试将一项业务事务保留在从 Web 层调用的一种服务方法中。
【讨论】:
嗯,我同意@Tomasz,除了在服务层上使用事务注释,这就是为什么......如果我将事务放在服务上,那么我在流程中的灵活性本身就被打破了,我更喜欢程序化处理交易的方式只是为了让我的选择开放以进行选择性交易管理。【参考方案2】:显然是 DAO 层。任何连接到数据访问层的东西都应该在 DAO 层中,并且(最好)用@Repository 注释,并且你的服务(用@Service 注释)应该有一个 DAO 实例的句柄。
一个服务可以调用多个 DAO,但反过来不行。去中心化自治组织 应该是原子性质的。
如果你开始一个事务,那么我认为它应该在服务层,这支持我之前提到的 DAO 应该是原子性质的陈述。
【讨论】:
但是如果我在 DAO 层启动事务,我会得到两个会话打开异常或没有会话绑定......因为如果我调用两种方法,这两种方法正在使用不同的会话正确..那么如何解决这个问题.. 为什么?对于通过多个 DAO 的任何事情,这都需要嵌套事务。 呃...“显然是 DAO 层”和“在服务层启动事务”。这些是互斥的。 @hvgotcodes:当您回复时,我想我正在编辑我的评论 :) 如果我的假设是正确的,您能再校对一遍吗? 不!如果您有服务级别的事务,那么您可以更好地控制多个 DAO 调用。考虑一个场景,您希望在多个相互依赖的 DAO 上提供事务支持,在这种情况下,服务是做出该决定的正确位置。如果您只有一个事务映射到 DAO,那么您可以在服务层轻松完成。它只是提供了更多的灵活性来玩,我不相信 DAO 相互联系,使它们紧密耦合。【参考方案3】:服务层、DAO 层、实体和控制器都有完整的信息。它有完整的教程,每个模块都有简短的描述。
网站:Spring MVC With Hibernate CRUD
或者您可以访问 YouTube 频道:Spring MVC with Hibernate CRUD VIDEO
【讨论】:
以上是关于在DAO,服务层架构中使用spring MVC和Hibernate的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章