首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >DAO和服务层的设计模式

DAO和服务层的设计模式
EN

Stack Overflow用户
提问于 2013-03-03 04:33:35
回答 1查看 9.5K关注 0票数 1

我对DAO和服务层模式有疑问,我正在使用Spring 3和Hibernate 4作为一个小应用程序。

关于我的申请的小描述

我有一个小应用程序,在这个应用程序中,员工和部门数据以JSF形式显示。

部门数据使用主数据数据表以表格形式显示,相关员工数据使用datatable以表格形式显示,这也是详细(主细节)场景。单击主数据表中的按钮后,将显示一个弹出式窗口,其中可以输入有关部门的详细信息,并在数据库表中保留数据(删除和更新的情况相同)。

我的设计如下所示

DAO层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface GenericDAO<T> {
    public void create(T entity);
    public void update(T entity);
    public void delete(T entity);
}

public interface DepartmentDAO extends GenericDAO<Department>
--methods for getting Department list and others
  public void findDepartment(DepartmentData data);
  -----

 public interface EmployeeDAO extends GenericDAO<Employee>
 --methods for getting Employeelist and others
 ---

服务层

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface DepartmentService {
 public void findDepartment(DepartmentData data);
 -- other methods
 }

@Transactional
@Named
public class DepartmentServiceImpl implements DepartmentService {

@Inject
DepartmentDAO departmentDAO;

-- implementation of methods
}

public interface EmployeeService {
 public void findEmployees(EmployeeData data);
 -- other methods
 }

@Transactional
@Named
public class EmployeeServiceImpl implements EmployeeService {

@Inject
EmployeeDAO employeeDAO;

-- implementation of methods
}

我的问题是,对于Department和Employee,我应该使用一个服务接口或类,就像我对JSF使用一个ManagedBean一样,还是应该为Department和Employee使用单独的惰性面和类?如果将所有DAO方法都包含在一个服务实现类中,并且具有@ transactions,那么在数据库事务处理时,它会出现性能问题吗?是否应该使用类似于GenericDAO的通用服务接口?

有什么帮助是非常值得赞赏的吗?

更新1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"
>   
    <context:component-scan base-package="net.test" />
    <!-- Data Source Declaration -->    
    <bean id="DataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/myDS"/>     
</bean>
    <bean
        class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
    <bean class="org.springframework.orm.hibernate4.HibernateExceptionTranslator" />
    <!-- JPA Entity Manager Factory -->
    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="DataSource" />
        <property name="packagesToScan" value="net.test.entity" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="false" />
                <property name="databasePlatform" value="${jdbc.dialectClass}" />
            </bean>
        </property>
    </bean>
    <bean id="defaultLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" />
    <!-- Session Factory Declaration -->
    <bean id="SessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="DataSource" />
        <property name="annotatedClasses">
            <list>
                <value>net.test.entity.Employee</value>
                <value>net.test.entity.Department</value>

            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.query.factory_class">org.hibernate.hql.internal.classic.ClassicQueryTranslatorFactory
                </prop>
            </props>
        </property>
    </bean> 
    <tx:annotation-driven transaction-manager="txManager" />
    <tx:annotation-driven transaction-manager="transactionManager" />   
    <bean id="txManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="SessionFactory" />
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>
    <!-- <tx:annotation-driven transaction-manager="txManager"/> -->
    <context:annotation-config />
    <bean id="hibernateStatisticsMBean" class="org.hibernate.jmx.StatisticsService">
        <property name="statisticsEnabled" value="true" />
        <property name="sessionFactory" value="#{entityManagerFactory.sessionFactory}" />
    </bean>
    <bean name="ehCacheManagerMBean"
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" />
    <bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
        <property name="locateExistingServerIfPossible" value="true" />
    </bean>
    <bean id="jmxExporter" class="org.springframework.jmx.export.MBeanExporter"
        lazy-init="false">
        <property name="server" ref="mbeanServer" />
        <property name="registrationBehaviorName" value="REGISTRATION_REPLACE_EXISTING" />
        <property name="beans">
            <map>
                <entry key="SpringBeans:name=hibernateStatisticsMBean"
                    value-ref="hibernateStatisticsMBean" />
                <entry key="SpringBeans:name=ehCacheManagerMBean" value-ref="ehCacheManagerMBean" />
            </map>
        </property>
    </bean>
</beans>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-03 05:02:27

要真正回答这个问题,我们需要详细说明@Transactional的语义是如何配置的。例如,每个DAO最终将运行在一个单独的事务中,或者join在Java级别热切地连接在一起,在数据库级别上则懒洋洋地运行等等。

假设只有一个数据库的“公共”配置,以及连接作为服务懒洋洋地被重用,然后加入共享请求级别事务;那么,无论您使用一个服务还是两个服务,我都不会有太大的顾虑。

从性能的角度来看,对数据库的往返次数、数据库请求的工作负载以及事务在数据库级别上保持的时间等都将产生很大的影响。如果有一两个Java对象加入Java级别的事务,而这些事务可能或不受数据库连接(更不用说事务)的支持,那么性能数字就不会相形见绌。您可能会发现序列化多个单独请求所产生的延迟,在这种情况下,可能需要组合、批处理或缓存一些查询。这最好用一个DAO来完成;但是,只有当您有一个度量的性能问题时才这样做。

在这里,团队约定和交流设计/领域模型的意图将更加重要。因此,我认为你是最适合回答你自己的问题的人,不管是一份还是两份。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15185705

复制
相关文章
在Windows上如何后台运行JuiceFS
JuiceFS的Badger引擎改造完成以后,需要在Windows下面进行后台运行。因为现有的JuiceFS中还没有在Windows下的后台运行实现,所以需要通过其他途径解决。
用户1260683
2022/03/30
2.9K0
在Windows上如何后台运行JuiceFS
在 Linux or windows 上后台运行服务
  此时可以访问 http://ip:8000 验证服务是否成功启动了(详细操作见另一篇文章-Python 一行搭建文件服务器)
我是胖虎啊
2022/06/27
3.3K0
在 Linux or windows 上后台运行服务
在Windows上使用Docker运行.NetCore
今天我们来说下如何在windows下使用docker运行.net core,既然是docker,那么我们首先得在windows上安装docker。
小世界的野孩子
2019/09/11
4.3K0
在Windows上使用Docker运行.NetCore
在Windows上运行单节点的Cassandra
Cassandra可以安裝在很多系统上, 我是安装在windows server 2008 R2上,安装相当简单,只要把下载下来的压缩包解压缩放到一个目录下就可以了,这里主要是记录下使用体验: Cassandra官网: http://cassandra.apache.org/,下载页面 http://cassandra.apache.org/download/ Cassandra用java开发的,要求安装JVM 1.6以上,推荐 Version 6 Update 23  到Java官网下载 http://w
张善友
2018/01/19
2.4K0
在Windows上运行单节点的Cassandra
在Windows上以服务方式运行 MSOPenTech/Redis
ServiceStack.Redis 使用教程里提到Redis最好还是部署到Linux下去,Windows只是用来做开发环境,现在这个命题发生改变了,在Windows上也可以部署生产环境的Redis,这都要感谢微软的开放,把Redis在Windows上的环境给我们搞定了,最新的版本已经支持64位了。那么Redis在32位上的存储能力受限于可用的地址空间,也就是3GB。 要在Windows上运行64位Redis ,可以从https://github.com/MSOpenTech/redis 获取一份Redis
张善友
2018/01/29
1.4K0
在Windows上以服务方式运行 MSOPenTech/Redis
Windows 上运行 Zookeeper
2.下载 Zookeeper https://zookeeper.apache.org/releases.html
晓晨
2020/11/09
1.6K0
6个工具助你在Windows上轻松运行Kubernetes
Kubernetes 主要是一种 Linux 技术,因此在 Linux 上运行它是相当简单的。但 Windows 上的开发人员,可不可以在 Win 上运行 Kubernetes?
我的小碗汤
2021/12/31
2.4K0
6个工具助你在Windows上轻松运行Kubernetes
Apache Kafka 在 Windows 系统上设置与运行教程
手把手教你在 Windows 系统安装运行 Apache Zookeeper 和 Apache Kafka 服务。
柳公子
2018/09/17
2.7K0
Apache Kafka 在 Windows 系统上设置与运行教程
在Windows上运行Rainbond,10分钟快速安装
经过适配Mac以后,Windows的适配也是成为了近期的小目标,经过不断地测试,不断地研究。最后也是达成了完美运行的效果,实现了真正意义上的任何场景,多种架构的完美适配,让手里的电脑真正称的上是生产力工具。
Rainbond开源
2022/01/11
1.6K0
curl for windows安装
1、下载curl for windows https://curl.haxx.se/download.html 2、curl for windows解压缩 3、环境变量配置 C:\curl-7.6
程裕强
2019/07/02
2.3K0
curl for windows安装
flutter 在windows和linux上运行IOS UI模拟器
之前发视频总是有人留言,我用的什么模拟器,今天给大家说一下 我一般用的是device_preview这个插件,这个插件的闲置是只能做UI上的模拟,并没有真正的运行环境。近似您的应用程序在另一台设备上的外观和性能。
徐建国
2021/11/30
1.9K0
在QEMU上运行OPTEE
TEE越来越成为一种基础的安全技术,optee作为一种优秀的开源TEE OS正吸引了越来越多的厂商,越来越多的学习者,安智客之前也多次介绍过
安智客
2018/07/30
2.6K0
在QEMU上运行OPTEE
在windows中:双击运行Python
一、安装Python解释器的windows环境,如果双击运行*.py的文件,会闪退。怎样避免闪退呢?
py3study
2020/01/06
4.6K0
在windows中:双击运行Python
python程序怎样在windows运行
1.首先下载安装python,建议安装2.7版本以上,3.0版本以下,由于3.0版本以上不向下兼容,体验较差。
py3study
2020/01/13
2.4K0
在Windows安装运行Kafka
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
chenchenchen
2019/09/02
5.3K0
在Windows安装运行Kafka
windows下使用curl命令 && 常用curl命令
什么是curl命令? curl是利用URL语法在命令行方式下工作的开源文件传输工具。它被广泛应用在Unix、多种Linux发行版中,并且有DOS和Win32、Win64下的移植版本。 如何在win
Java学习123
2018/05/16
5K0
在Windows上安装Jenkins
apache-tomcat/bin目录下的startup.bat在windows上启动。
清菡
2020/12/02
2.4K0
在Windows上安装Jenkins
MongoDB - 在Windows上安装
1 下载MongoDB社区版, 下载链接 http://www.mongodb.org/downloads?_ga=1.129742796.1997610832.1481940266 2 安装Mong
我思故我在
2018/05/11
2.3K0
在 Windows 上安装 Composer
(2) 选中PHP安装目录下的php.exe,PHP的安装路径在环境变量 Path 中,则会自动选中,否则需要手动选中
很酷的站长
2023/02/17
2.1K0
在 Windows 上安装 Composer
CygWin:windows上运行类linux命令
CygWin是一个在Windows平台上运行的类UNIX模拟环境,是Cygnus Solutions公司开发的自由软件。它提供了类似于Linux系统的终端环境和工具,使用户可以在Windows平台上运行Unix-like的程序,如Bash、awk、sed和grep等 。
唯一Chat
2023/07/10
4340
CygWin:windows上运行类linux命令

相似问题

return函数是用来做什么的?

10

serialize到底是做什么的?

30

这段PHP代码是用来做什么的?

30

在php中{}是用来做什么的?

22

函数的指针是用来做什么的?

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文