我正在设计一个基于JPA / Hibernate,Spring和Wicket的新应用。我对DAO和Service层之间的区别还不清楚。根据维基百科,DAO是
一个为某种类型的数据库或持久性机制提供抽象接口的对象,提供某些特定的操作而不公开数据库的详细信息。
我想知道DAO是否可以包含与数据访问无关的方法,但是使用查询执行起来会更容易吗?例如,“获取在一组特定机场上运营的所有航空公司的列表”?在我看来,它更像是一种服务层方法,但是我不确定在服务层中使用JPA
EntityManager是否是一种良好做法的示例?
DAO应该提供对单个 相关 数据源的访问,并且根据业务模型的复杂程度,DAO
将返回完整的业务对象或简单的数据对象。无论哪种方式,DAO方法都应在某种程度上紧密反映数据库。
服务可以提供更高级别的界面,不仅可以处理您的业务对象,而且可以首先访问它们。如果从服务获得业务对象,则可以从不同的数据库(和不同的DAO)创建该对象,并可以使用HTTP请求中的信息修饰该对象。它可能具有某些业务逻辑,可以将多个数据对象转换为单个健壮的业务对象。
我通常会创建一个DAO,以为将要使用该数据库或与业务相关的数据集的任何人都将使用它,它实际上是数据库中触发器,函数和存储过程之外的最低级别的代码。
具体问题的答案:
我想知道DAO是否可以包含与数据访问无关的方法,但是使用查询执行起来会更容易吗?
在大多数情况下,您不希望在服务层中使用更复杂的业务逻辑,即从单独的查询中组装数据。但是,如果您担心处理速度,则服务层可能会将动作委派给DAO,即使它破坏了模型的美感,其方式与C
++程序员可以编写汇编代码来加快某些动作的方式几乎相同。
在我看来,它更像是一种服务层方法,但是我不确定在服务层中使用JPA EntityManager是否是良好做法的示例?
如果要在服务中使用实体管理器,那么可以将实体管理器视为DAO,因为这就是事实。如果您需要删除一些多余的查询构建,请不要在服务类中删除,将其提取到利用实体管理器的类中,然后将其制成DAO。如果您的用例非常简单,则可以完全跳过服务层,而在控制器中使用实体管理器或DAO,因为您要做的所有服务都是将对getAirplaneById()
DAO的调用传递给其他用户findAirplaneById()
更新-
为了澄清下面的讨论,在大多数情况下(由于注释中突出显示的各种原因)还存在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...
}
}
在我的示例中,我有一个Hibernate实体和一个DAO。 当我以这种方式使用DAO时 数据库中只保存了一行(Action2)。当我删除注释时,两行(Action1和Action2)都被保存(这是我需要的行为)。我的问题是服务层上的事务注释如何影响事务(方法executeTransaction())的执行。为什么没有服务层上的事务性注释,这两行都保存在数据库中,而只有最后一行与此注释一起保存?
问题内容: 我正在使用hibernate处理spring项目,并希望使用ehcache实现二级缓存。我看到了许多解决方法: 引入注释 一个旨在成为继任者的工具集。 可以很好地集成到休眠本身中,以使用例如注释进行缓存。 使用代理。基于注释的配置迅速变得有限或复杂(例如,注释嵌套的多个级别) 就我个人而言,我认为还不够彻底,因此我可能更愿意考虑发展得更为积极。尽管这似乎是最完整的实现(例如,读取和写入
问题内容: 有人可以透视一下JPA和Hibernate之间的区别吗?还是将这些互补的概念一起使用? 问题答案: 大致来说,JPA是java社区的一个标准,这里是specs,它是由Hibernate家伙实现(并扩展)的(此处提供一些信息)。作为规范,您将不会直接使用JPA,而是使用JPA实现。 请注意,如果要使用hibernateJPA扩展,将破坏与其他JPA实现的兼容性(尽管有些人会说“为什么要使
问题内容: 我使用 hibernate* / JPA 实现 服务器端数据分页 ,底层数据库是 MS SQL Server 2008。 * SQL生成如下: (主要工作在于创建适当的过滤器/排序,但这与此处无关) 我正在观察的是以下SQL: … 等等。 显然,如果基础结果集太大,这(a)会遇到严重问题,而(b)与分页根本没有太大关系:-( 有人遇到过同样的问题吗? 更新 :似乎NHibernate(
问题内容: 我的web应用程序已经得到了很多服务表/实体,如,,,等。 每次添加新实体时,都必须编写一个DAO。问题是,它们基本上是相同的,但是唯一的区别是 实体类本身 。 我知道Hibernate工具可以为我自动生成代码,但是我现在不能使用它们(不要问为什么),所以我想到了 Generic DAO 。关于这方面有很多文献,但我无法整理并使其与Spring一起使用。 我认为这全都是关于泛型的,它将
问题内容: 我的Maven依赖项出了什么问题。当我包含JPA时,我会列出pf例外 这是我的Maven依赖项 我的例外 和我的源代码 因此,我没有任何想法(不幸的是,没有示例)如何运行Spring boot和休眠两者。 问题答案: 您是否为数据源设置了或?这是一个例子: 有关可以在何处放置配置文件以及如何配置应用程序以处理任何目录中的属性文件的说明,请参阅此链接以获取更多信息。