<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
ORM如何用才不是滥用
因为web 应用每一次处理都要响应一个数据库操作,添加,修改,或者删除,所以关联集合对象的取出不是必要的
ORM自动取出对象,自动发现变化,自动保存也许只有在桌面程序或者有状态的web应用,例如jsf中才有意义,而且必须不是open session in view模式.否则操作中会存在大量的取出对象,修改对象,然后再保存回去的操作。
所以为了让每一次click中db操作最少,必须对DAO进行细力度的封装
以petstore中order对象的装载为例,其中要用到一个lineitems的集合
public Order getOrder(int orderId) {
Order order = null;
Object parameterObject = new Integer(orderId);
order = (Order) queryForObject("getOrder", parameterObject);
order.setLineItems(queryForList("getLineItemsByOrderId", new Integer(order.getOrderId())));
return order;
}
在DAO里面,把关联分成两步来填充。
对于一个完全domain设计的系统中,对象的集合属性的对象中可能存在大量的级联的关联
完全用lazy load不是一个好方法,无论从代码上,还是从性能上。
所以可以说ORM在设计之出就没有给出一个对于orm自身的设计模式的说明
例如Order->LineItem->Item->Product->Category->ParentCategory,
这样我持久一个order,该需要多少个操作呢
尤其在web这种stateless的环境中
对于一个最简单的student-sc-class,三张表,如果要把一个学生和一门课关联起来,只要在DAO里面,SetStuClass(stu_id,cls_id)就可以了,如果用ORM来做,s需要先load一个student对象,然后stu.addClass(class),然后session.save(stu),这样还真是kinda weird
=======
所以对于orm操作模式化这个问题,首先要把写和读操作分开来看
对于读:也就是查询,
如果结果仅仅是某个对象,且附属表的信息可以作为该对象的集合
例如employee-1:n-employeecontract,可以采用ORM或者DAO,甚至ORM在这里更方便
如果结果需要的字段跨多个表,结果集可以用map来存放
例如 unit-1:n-employeecontract-n:1-employee ,现在要显示某单位所有的employeecontract为一个列表,那么可能三个表各需要几个字段,此时就不应该使用ORM,而用List来存放
对于写:
例如在employee-1:n-employeecontract中保存一张employeecontract,完全没必要使用employee的集合来保存,但是如果一旦定义了employee和employeecontract,这里就必须使用ORM来保存,否则employeecontract就是一个emptylist,所以,上面的第一条还是应该使用DAO来保存
所以,以上就说明了一点,在必须有pojo这样domain object的实际应用中,ORM并不可行,细力度的DAO才是一个更好的方案,但是我们还需要一个工具,能将pojo中需要的元素自动映射到表里面
当然,hibernate可以做这样的工具,不过要吧字段以xml或annotation的方式声明出来,ibatis也可以做,不过映射文件也太过于复杂了
其实只是需要一个像php的adodb这样的工具,不过必须使用对象,主要是处理对象变量填充和变量类型转换,而这两个过程在php中是不需要的
反正hibernate是肯定要用的,关键是怎么用才不是滥用
hibernate3也对SQL有很好的支持支持
sess.createSQLQuery("SELECT * FROM CATS").list();
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();
sess.createSQLQuery("SELECT * FROM CATS").addEntity(Cat.class);
sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").addEntity(Cat.class);
所以hibernate最佳实践可以归结为:
更新还是以表为单位手动更新,读也是以表或视图为单位,对于关联的集合,手动加载
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1508581
相关推荐
通过对比传统JMS实现和Spring JMS,我们可以看到Spring JMS显著减少了开发者处理消息时的代码量和复杂性,使得异步消息处理的实现更为简洁。这不仅降低了出错的可能性,也使得代码更易于测试和维护。Spring JMS的...
在IT行业中,Spring框架是Java应用开发的基石,它提供了丰富的功能来简化应用程序的构建,而JMS(Java Message Service)则是处理异步通信的一种标准API。Tomcat作为轻量级的应用服务器,常用于部署Spring应用。在这...
【Spring JMS 知识点详解】 Spring JMS 是 Spring ...总结来说,Spring JMS 通过提供模板和容器化的消息处理,大大简化了 JMS 的使用,使得异步消息传递变得简单易用。这对于构建高可用、可扩展的 SOA 系统至关重要。
通过 Spring JMS,我们可以利用消息中间件(如 ActiveMQ、RabbitMQ 或 HornetQ)来解耦生产者(发送消息的组件)和消费者(接收并处理消息的组件),从而实现异步处理。这种解耦有助于提高系统的可扩展性和容错性。 ...
博客可能涵盖Spring JMS如何处理消息传递失败,以及如何结合JMS与Spring的事务管理。 7. **实战示例**:最后,博主会提供一个实际的示例,展示如何在一个简单的Spring应用中集成JMS,包括创建JNDI资源、配置Spring...
总结起来,这个"spring_jms"实例旨在帮助初学者了解如何在Spring应用中使用JMS进行异步通信。通过结合Maven、Spring框架和ActiveMQ,我们可以构建一个高效、可靠的分布式消息系统,提升应用的性能和灵活性。通过深入...
9. **Spring框架的支持**:Spring框架也提供了对JMS的全面支持,通过`@JmsListener`注解,可以在方法级别定义消息监听器,简化了异步消息处理的编程模型。 10. **监控和调试**:在实际应用中,需要监控消息队列的...
Spring Boot提供了自动配置,简化了Spring-JMS的使用。 总的来说,Spring-JMS为开发者提供了一个强大且灵活的工具,用于构建基于JMS的应用。通过理解和熟练使用Spring-JMS,你可以构建出高效、可靠、可扩展的企业级...
MessageListenerContainer是Spring JMS用于异步处理消息的组件,它可以监听一个或多个队列或主题,并在接收到消息时调用预先注册的MessageListener。这使得应用程序可以专注于业务逻辑,而无需关心消息的接收和处理...
Spring JMS(Java Message Service)模块是Spring框架的一部分,用于处理消息传递,允许应用进行异步通信。本篇将深入探讨"Spring JMS消息处理-不基于JNDI"这一主题。 在传统的JMS实现中,JNDI(Java Naming and ...
- **消费者(Consumer)**:从消息队列中接收并处理消息的应用。 - **消息代理(Message Broker)**:如ActiveMQ,负责管理和转发消息。 2. **Spring与JMS整合** - **Spring JMS模块**:Spring框架提供了一组JMS...
Spring框架则简化了使用JEE组件(包括JMS)的任务。它提供的模板机制隐藏了典型的JMS实现的细节,这样开发人员可以集中精力放在处理消息的实际工作中,而不用担心如何去创建,访问或清除JMS资源。本文将对SpringJMSAP
例如,可以使用JMS来处理后台任务,如数据批处理或异步通知。通过Spring的JMS抽象,我们可以更专注于业务逻辑,而不必关心消息传输的底层细节。 文件"基于Spring的JMS编程-1"可能包含了关于如何在Spring环境中配置...
1. **解耦和异步处理**:Spring JMS可用于系统间的解耦,一个系统发送消息,另一个系统接收并处理,降低了系统间的依赖性。 2. **批量处理和调度**:通过消息队列,可以实现批量数据处理和定时任务调度,避免了同步...
"JMS之Spring + ActiveMQ实现消息队列"涉及到的关键知识点包括:Spring框架的JMS支持、ActiveMQ的使用、ConnectionFactory的配置、JmsTemplate和MessageListener的实现,以及消息队列在解决系统解耦和异步处理中的...
Spring通过其`org.springframework.jms`包提供了丰富的JMS抽象,简化了JMS的使用。它提供了一种声明式的方式来配置JMS模板,使得开发者可以方便地发送和接收消息。此外,Spring还支持JMS监听器容器,使得消息的消费...
Spring-JMS是Spring框架的一部分,专门用于处理Java消息服务(JMS)的集成。这个jar包,即`spring-jms-3.1.1.RELEASE.jar`,包含了Spring对JMS API的抽象和扩展,使得在Spring应用中使用JMS变得更加简单和灵活。 **...