当前位置: 首页 > 面试题库 >

DAO and Service layers (JPA/Hibernate + Spring)

杨征
2023-03-14
问题内容

我正在设计一个基于JPA / Hibernate,Spring和Wicket的新应用。不过,DAO和Service层之间的区别对我来说还不清楚。根据维基百科,DAO是

一个为某种类型的数据库或持久性机制提供抽象接口的对象,提供一些特定的操作而不公开数据库的详细信息。

我想知道DAO是否可以包含与数据访问无关的方法,但是使用查询执行起来会更容易吗?例如,“获取在一组特定机场上运营的所有航空公司的列表”?在我看来,它更像是一种服务层方法,但是我不确定在服务层中使用JPA EntityManager是否是一种良好做法的示例?


问题答案:

DAO应该提供对单个相关数据源的访问,并且取决于业务模型的复杂程度,DAO 将返回完整的业务对象或简单的数据对象。无论哪种方式,DAO方法都应在某种程度上紧密反映数据库。

服务可以提供更高级别的界面,不仅可以处理你的业务对象,还可以首先访问它们。如果从服务获得业务对象,则可以从不同的数据库(和不同的DAO)创建该对象,并可以使用HTTP请求中的信息修饰该对象。它可能具有某些业务逻辑,可以将多个数据对象转换为单个健壮的业务对象。

我通常会创建一个DAO,以为将要使用该数据库或一组业务相关数据的任何人都将使用它,这实际上是数据库中触发器,函数和存储过程之外的最低级代码。

对特定问题的答案:

我想知道DAO是否可以包含与数据访问无关的方法,但是使用查询执行起来会更容易吗?

在大多数情况下,你不希望在服务层中使用更复杂的业务逻辑,即从单独的查询中组装数据。但是,如果你担心处理速度,那么即使服务层破坏了模型的美观性,服务层也可能会将动作委派给DAO,这与C ++程序员可以编写汇编html" target="_blank">代码来加快某些动作的方式几乎相同。

在我看来,它更像是一种服务层方法,但是我不确定在服务层中使用JPA EntityManager是否是一种良好做法的示例?

如果要在服务中使用实体管理器,那么可以将实体管理器视为DAO,因为这就是事实。如果你需要删除一些多余的查询构建,请不要在服务类中删除,将其提取到利用实体管理器的类中,然后将其制成DAO。如果你的用例真的很简单,则可以完全跳过服务层,而在控制器中使用实体管理器或DAO,因为你要做的所有服务都是将对getAirplaneById()DAO的调用传递出去findAirplaneById()

更新-为澄清下面的讨论,在大多数情况下(由于注释中突出显示的各种原因)还存在DAO层的情况下,在服务中使用实体管理器可能不是最佳决定。但我认为,鉴于以下情况,这将是完全合理的:

  1. 服务需要与不同的数据集进行交互
  2. 至少一组数据已经具有DAO
  3. 服务类驻留在需要一些持久性的模块中,该持久性足够简单以至于不能保证其自己的DAO
    例。
//some system that contains all our customers information
class PersonDao {
   findPersonBySSN( long ssn )
}

//some other system where we store pets
class PetDao {
   findPetsByAreaCode()
   findCatByFullName()
}

//some web portal your building has this service
class OurPortalPetLostAndFoundService {

   notifyOfLocalLostPets( Person p ) {
      Location l = ourPortalEntityManager.findSingle( PortalUser.class, p.getSSN() )
        .getOptions().getLocation();
      ... use other DAO's to get contact information and pets...
   }
}


 类似资料:
  • Micronaut/JPA/Hibernate小写了我的数据库表的名称,并在启动时抛出一个错误,说找不到该表。表在那里,但它是用大写字母命名的。我如何配置micronaut/jpa/hibernate来考虑我的表名的大小写 我在MySQL8数据库中有一个现有的表< code >小部件,我需要使用jpa/hibernate从micronaut服务访问它。不幸的是,在启动时的模式验证期间抛出了一个错误

  • 1.JPA 1.1 自动扫描Entity 彻底删除persistence.xml中Entity的逐一配置,采用自动扫描。因为Weblogic/Jboss这些自带JPA支持的应用服务器有时候会多管闲事的扫描persistence.xml,因此彻底删除掉这个文件是个不错的选择。 <bean id="entityManagerFactory" class="org.springframework

  • 我已经为我的spring boot应用程序创建了所有模型,并根据业务逻辑成功地指定了它们之间的关系。在我的属性文件中,我将hibernate auto-ddl选项设置为create以根据实体之间的关系生成所有表。我也在使用liquibase进行数据库迁移。 但是,application-prod.yml中合适的方言应该是什么呢?我正在生产中使用MYSQL。我在这里使用的当前方言是“org.hibe

  • 我想使用Hibernate作为带有glassfish服务器的JPA提供程序。我在maven中添加了hiberante-entitymanager依赖项,但每次运行项目时都会出现这个错误。我是不是错过了另一个依赖。 这是pom.xml内容: 请帮帮忙。

  • 1)我有2张桌子,用户和user_profile一对一关系, 用户表: id,用户名,名字,姓氏-ID有主键, 用户配置文件: id,name,user_id-ID具有主键,user _ ID具有用户表的外键 2) 以下是两个JPA实体对象 用户: 用户配置文件: 当我试图插入到两个表中时,我看到列被添加到带有值的USER表中,而我在USER_PROFILE表的列中看不到任何值。 我是这个MySQ

  • 问题内容: 按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 到目前为止,我有一个具有持久性的Spring应用程序。但是现在我想将Hibernate与JPA一起使用来完成我的所有数据库活动。我想使用一个entitymana

  • Spring Data JPA不是一个JPA实现,它是对数据库数据访问的抽象。我不能理解这种表达方式与JPA的实现(比如Hibernate)进行比较。在使用Spring Data JPA时,要使用CRUD操作,必须从CrudRepository接口进行扩展。但是没有Hibernate,Spring Data JPA无法独立工作,因为它无法将java对象转换为实体。但是!Hibernate还可以执行

  • 为什么它更高效,因为像'your_name'这样的c.name扫描只在第一个查询中发生一次。