`
deafwolf
  • 浏览: 11473 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

业务逻辑能否不依赖于持久层?

阅读更多
我现在的架构是po->manager->service->action
其中manager实现业务逻辑,提供事务,action调用service
service中仅获取session,控制事务,load对象,然后调用manager,所以我可以单独的测试业务而不依赖于持久层

目前有这么个场景:一张地图,分成小块。给我一个坐标和半径,然后判断这个范围内是否有水。
因为地图是上下相通,左右相通,所以我要算出这个范围内所有地块的id,然后load出来,再逐格判断
于是代码就得类似这样:
List<Integer> idList=manager.computeIdList(int x,int y);
Query query = session.createQuery("from Field where id in (:list)");
query.setParameterList("list", idList);
boolean hasWater=manager.fieldHasWater(query.list());

我想把这些东西都封到manage里,于是我定义了一个MyMap,与地块是一对多,内部用map,key为地块的id
这时会多个MyMap表,里面只有一行数据,地块表会多一列,以对应MyMap
于是manager就能写成:
boolean hasWater(int x,int y,MyMap map);
然后在内部用may.getField(int id)来得到地块
地块的数量有几十万,所以我用了lazy="extra"。

这种设计是否合理,是否会产生某些问题?


PS:<map-key type="int" formula="id" />,这种情况下不能用extra,hibernate生成的查询条件会出现null
再PS:以前看过一篇文章,select * from table where id in(1,2)的性能不如select * from table where id=1 union select * from table where id=2
因为in查询不能很好的利用索引,所以我觉得hibernate在缓存命中高的情况下,用循环load对象比用in查询要好一点,这个没测试过,高手有经验请说说
分享到:
评论
2 楼 deafwolf 2007-05-15  
wolfsquare 写道
1.建议事务控制与业务调用一致,否则会造成业务异常而无法完全回滚。
2.当你在设计业务调用接口时,需要考虑持久化相关的问题,那么可以肯定要不就是该业务不是业务,或者后者完全是多虑。

多谢回复,不过这两点我不是很明白。
这是不使用MyMap的代码
public class Field {
	private Integer id;

	private int x;
	private int y;
	private boolean hasWater;
}

public class CoreManage {
	public static List<Integer> getIdList(int x, int y, int radius) {
		// ....
	}

	public static boolean hasWater(List<Field> list) {
		for (Field tmp : list) {
			if (tmp.isHasWater()) {
				return true;
			}
		}
		return false;
	}
}

public class CoreService {
	private SessionFactory sessionFactory;

	public boolean hasWater(int x, int y, int radius) {
		Session session = sessionFactory.openSession();
		try {
			session.beginTransaction();
			List idList = CoreManage.getIdList(x, y, radius);
			Query query = session.createQuery("from Field where id in (:list)");
			query.setParameterList("list", idList);
			List<Field> list = (List<Field>) query.list();
			return CoreManage.hasWater(list);
		} catch (Exception e) {
			session.getTransaction().rollback();
			return false;
		} finally {
			session.close();
		}
	}
}


使用MyMap后可以改成如下的,Field不变
public class MyMap {
	private Map<Integer, Field> map = new HashMap<Integer, Field>();

	public Field getField(int id) {
		return map.get(id);
	}
}

public class CoreManage {
	public static List<Integer> getIdList(int x, int y, int radius) {
		// ....
	}

	public static boolean hasWater(int x, int y, int radius, MyMap map) {
		List<Integer> idList = CoreManage.getIdList(x, y, radius);
		for (int r : idList) {
			if (map.getField(r).isHasWater()) {
				return true;
			}
		}
		return false;
	}
}

public class CoreService {
	private SessionFactory sessionFactory;

	public boolean hasWater(int x, int y, int radius) {
		Session session = sessionFactory.openSession();
		try {
			session.beginTransaction();
			MyMap map=(MyMap)session.get(MyMap.class, 1);
			return CoreManage.hasWater(x,y,radius,map);
		} catch (Exception e) {
			session.getTransaction().rollback();
			return false;
		} finally {
			session.close();
		}
	}
}


像上面的代码那样,manage可以封上全部的业务,service只提供事务,这样我可以脱离持久层测试业务,我可以伪造一个MyMap用来测试,而从逻辑上讲,从地图上获取某一格,也比较自然
而按第一段的写法,service里是有业务逻辑的,测试的话,就得搭上数据库才行

把hibernate作为DAO来使用,不使用DAO层,service里不实现业务,只提供事务,这种用法在个别帖子里也出现过,不过特别少,所以我拿不准这种用法有什么缺点,所以还是希望能得到一些指点。
1 楼 wolfsquare 2007-05-15  
1.建议事务控制与业务调用一致,否则会造成业务异常而无法完全回滚。
2.当你在设计业务调用接口时,需要考虑持久化相关的问题,那么可以肯定要不就是该业务不是业务,或者后者完全是多虑。

相关推荐

    面向应用的持久层设计

    1. **清晰的分层**:持久层应当是一个明确的逻辑层,它与其他层(如表示层、业务逻辑层等)有着清晰的界限。这意味着数据持久化的实现细节不应泄露给系统的其他部分。 2. **低耦合**:持久层应该尽可能减少对外部...

    用 Hibernate 和 Spring 开发持久层

    ### 使用Hibernate和Spring开发持久层的关键知识点 #### 引言 在现代企业级应用开发中...通过深入理解Hibernate的ORM能力和Spring的依赖注入与AOP特性,开发者能够构建出既符合业务需求又易于维护的持久层解决方案。

    spring + hibernate 数据话持久层

    Spring通过其依赖注入(DI)和面向切面编程(AOP)功能,简化了Hibernate的配置和使用,使得开发者能够更加专注于业务逻辑的实现,而无需过多关注底层的事务管理和资源管理。 ### 数据源与事务管理 #### 数据源...

    04. SpringBoot整合持久层技术

    SpringBoot整合持久层技术是Java开发中的重要环节,它简化了传统的数据访问配置,使得开发者可以更加专注于业务逻辑。在SpringBoot中,我们通常会利用其内置的数据访问框架,如JPA(Java Persistence API)和MyBatis...

    iBATIS持久层框架开发

    iBATIS是一个开源的Java持久层框架,它简化了数据库操作与应用程序的集成,使得开发者可以将注意力集中在SQL语句的编写和业务逻辑的实现上,而无需关注底层的JDBC代码。本教程将深入探讨iBATIS的核心概念、主要功能...

    持久层用户开发手册模板.pdf

    持久层是软件系统中负责数据存储和检索的部分,它为业务逻辑层提供了一种抽象,使得程序员可以不必直接处理SQL语句,而是通过对象化的API进行数据操作。这提高了代码的可读性和可维护性,降低了系统对数据库知识的...

    maven mybatis 插件 自动生成持久层代码

    在IT行业中,Maven和MyBatis是两个非常...总之,Maven MyBatis插件是提高开发效率和代码质量的有效工具,通过合理配置和使用,能够显著提升Java Web开发中的持久层代码生成效率,让开发者更多地专注于业务逻辑的实现。

    使用Hibernate快速实现持久层处理的实例工程源代码

    5. **DAO(Data Access Object)**:数据访问对象,封装了对数据库的所有操作,是业务逻辑和持久层之间的桥梁。 6. **Service和Controller**:服务层和控制器层,分别处理业务逻辑和用户请求。 7. **pom.xml**:如果...

    Spring的MVC Web应用中的持久层技术

    通过使用模板方法设计模式,它将常见的错误处理和资源关闭等任务自动化,使开发者能够专注于业务逻辑,提高代码的可读性和可维护性。 **二、JdbcTemplate的核心功能** 1. **自动管理连接**:JdbcTemplate会在需要...

    2022年优秀-Spring业务逻辑层技术.pptx

    Spring作为一个轻量级的容器,不仅管理着应用对象的生命周期,还提供了一个丰富的功能集,包括事务管理、持久化框架集成等,从而让开发人员能够更加专注于业务逻辑的实现。 1. **Spring框架简介** - **轻量级**:...

    java框架中持久层jpa的相关jar包

    它的出现是为了简化数据访问层的开发,让开发者能够更加专注于业务逻辑而不是底层的数据库操作。JPA通过提供一套API,使得开发者可以以面向对象的方式来操作数据库,而无需编写大量的SQL语句。 在Java应用中,...

    HIbernate,Ibatis等持久层开发文档

    在IT行业中,持久层框架是连接数据库和应用程序的重要桥梁,它们简化了数据操作,使得开发者可以专注于业务逻辑而不是底层数据库的交互。本压缩包包含两个关键的持久层框架——Hibernate和iBATIS的开发文档,将帮助...

    Java反射机制在数据持久层轻量级ORM框架中的应用研究.pdf

    分层架构将应用系统分为展示层、控制层和持久层,持久层负责与数据库的交互,独立于业务逻辑层,使得应用架构更为清晰,同时有利于代码的重用和维护。 通过本文的研究可以看出,Java的反射机制为数据持久层提供了一...

    第4章Spring业务逻辑层技术.ppt

    Spring 框架提供了很多基础的与业务逻辑无关的功能,比如事务管理、持久化框架集成等等,使用 Spring 框架,开发人员可以专注于业务逻辑开发。 Spring 框架的主要特点包括: * 轻量级:Spring 框架非常轻量级,从...

    PP 持久层代码生成器

    这样,开发者无需手动编写这些重复性工作,从而能更专注于业务逻辑的实现。 "PP 持久层代码生成器"支持以下主要功能: 1. **数据库元数据读取**:它可以连接到指定的数据库,获取表结构和字段信息,为代码生成提供...

    Hibernate数据持久层jar包源码解析

    《Hibernate数据持久层jar包源码解析》 在软件开发中,数据持久层是系统架构中的关键部分,它负责将应用程序的数据与数据库进行交互。Hibernate作为一款强大的Java对象关系映射(ORM)框架,极大地简化了这个过程。...

    JAVA PP持久层代码生成器

    FreeMarker是一个流行的、开源的Java模板引擎,它与JSP类似,但更专注于分离业务逻辑和视图展示。在JAVA PP持久层代码生成器中,FreeMarker扮演着关键角色,通过解析用户定义的模板文件,将数据库模型转换为对应的...

    三层体系结构总结:将业务规则、数据访问、合法性校验等工作放到了中间层进行处理

    在实际应用中,三层架构可能还会涉及到其他组件,如服务层(Service Layer)和持久层(Persistence Layer),它们可能是业务逻辑层和数据访问层的进一步细分。服务层可以提供更抽象的业务操作,而持久层则专注于具体...

    用 hibernate 和 spring 开发持久层.doc

    这样,开发者可以专注于业务逻辑,而无需关心底层的数据库交互。例如,Spring可以通过@Transactional注解自动开启和提交事务,使得代码更清晰、可读性更强。 4. 示例分析 在实际应用中,通常会定义一个数据访问...

Global site tag (gtag.js) - Google Analytics