`
piperzero
  • 浏览: 3518570 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

ORM如何用才不是滥用

阅读更多
<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.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最佳实践可以归结为:

更新还是以表为单位手动更新,读也是以表或视图为单位,对于关联的集合,手动加载




分享到:
评论

相关推荐

    pgorm:一个纯Python 3.7+中的n00by PostgreSQL ORM,可能会滥用asyncio,数据类和类型提示

    gor 一个纯Python 3.7+中的n00by PostgreSQL ORM,可能会滥用asyncio,数据类和类型提示为什么选择pgORM? 当使用python构建典型的Web服务时,往往会选择一个ORM作为其数据层。 如今,由于诸如Ember,React和Angular...

    2018_代码审计点线面实战.pdf

    ORM(Object-Relational Mapping)注入主要发生在使用ORM工具如Hibernate时,由于不当的查询构造,使得攻击者能够绕过ORM的安全防护,执行自定义SQL。例如,使用JPQL或Hibernate ORM,如果不正确处理动态SQL,可能会...

    hibernate入门

    使用Hibernate时,应注意不要滥用Session,避免内存泄漏。同时,理解并合理使用缓存策略,以及选择合适的查询方式,都是优化性能的关键。 通过阅读给定的博客链接(已提供但无法直接访问),你将进一步学习到如何...

    Laravel开发-parser-abusehub

    本项目名为“Laravel开发-parser-abusehub”,显然聚焦于使用Laravel来开发一个特定的功能——解析并处理来自AbusHub或Abusix的通知。AbusHub和Abusix是网络安全领域中的服务,它们主要提供垃圾邮件、网络滥用和恶意...

    Laravel开发-abusereportable

    在Laravel框架中,"abusereportable"通常是指一种机制,允许用户或者系统管理员报告滥用行为,如垃圾邮件、恶意评论或者其他不适当的内容。这个机制可以帮助维护网站的秩序和用户体验,通过提供一个方便的方式来跟踪...

    Java开发手册 免费

    MySQL规约部分则对数据库的设计、查询优化、ORM使用等方面给出了详细规范,比如要求合理建立索引,使用预编译的SQL语句防止SQL注入攻击,以及合理的ORM映射。 工程规约部分涉及应用的架构分层、第三方库的管理、...

    ThreadLocal的几种误区

    当线程使用ThreadLocal时,它会查找或创建属于该线程的变量实例,而不是所有线程共享一个实例。 误区二:ThreadLocal与每个session相对应 在Java Web编程中,ThreadLocal与HTTP Session的概念混淆是常见的误解。...

    hibernate annotation 3.40

    在Hibernate 3.4.0版本中,Annotation的引入极大地简化了对象关系映射(ORM)的过程,使得开发者无需编写大量的XML配置文件,而是直接在Java实体类上使用注解进行数据映射。这一改变提高了开发效率,增强了代码的...

    大型web项目部署调优

    在这个场景中,项目使用了Struts作为Web层框架,Hibernate作为ORM工具,Spring作为应用上下文管理和依赖注入框架,而Weblogic Server作为EJB容器处理分布式事务。此外,硬件F5负载均衡器用于处理服务器间的流量分配...

    防止MySQL注入或HTML表单滥用的PHP程序

    6. 使用安全的编程框架和库:选择支持安全实践的编程框架和库,例如使用ORM(对象关系映射)可以减少直接编写SQL查询的需求,从而降低注入风险。 在实施用户输入验证时,开发者需要了解输入验证的两个重要方面:...

    Laravel开发-laravel-forecast .zip.zip

    使用Laravel的Eloquent ORM来操作这些数据。 6. **API认证和限流** 使用Laravel的中间件实现API密钥验证,确保只有合法用户可以访问天气预报API。同时,为防止滥用,可以设置限流策略限制每个用户在特定时间内的...

    阿里巴巴Java开发规范最新PDF20180208

    Java中的常量应该使用全部大写,单词之间用下划线隔开。如定义一个常量MAX_STOCK_COUNT,而不是MAX_COUNT。POJO类中的布尔类型变量不要加is前缀,以防止某些框架在序列化时出现错误。 格式规约 要求代码格式规整,...

    阿里巴巴Java开发手册终极版v1.3.0.zip

    - 静态规约:合理使用静态成员,避免滥用static导致的内存泄漏。 - 枚举规约:使用枚举替代常量,增强可读性和可维护性。 - 泛型规约:充分利用泛型,减少类型转换的麻烦,提高代码安全性。 3. **并发规约** - ...

    什么是Spring,他有什么特点?.docx

    Spring容器负责创建对象、管理它们的生命周期,并将依赖注入到对象中,而不是由对象自行管理。这种方式降低了对象之间的耦合度,提高了代码的可测试性。 3. **面向切面编程(AOP)**:Spring支持AOP,允许开发者将...

    跨站式SQL注入技巧与防护

    8. **使用ORM(对象关系映射)框架**:ORM可以自动处理SQL语句的构建,减少直接SQL拼接的机会。 9. **防火墙和入侵检测系统**:配置防火墙规则,阻止恶意流量,部署入侵检测系统以识别SQL注入尝试。 10. **教育...

    Laravel开发-wikipedia-grabber

    在 Wikipedia Grabber 中,可能使用中间件来限制 API 请求频率,防止滥用。 **9. 部署与维护** 完成开发后,应用需要部署到服务器。Laravel 支持各种部署策略,如使用 Docker 容器化部署或传统的共享主机。同时,...

    Go-shrot-url基于go语言和新浪接口的短链接生成使用beego作为mvc框架

    2. 安全性:考虑到短链接可能被滥用,需要对API调用进行限制,如设置调用频率上限,防止DDoS攻击。同时,对用户输入进行验证,避免SQL注入等安全风险。 3. 性能优化:通过缓存策略、负载均衡和异步处理等方式,提升...

    Laravel开发-static-references-laravel

    Laravel提供了`config`助手函数和配置文件系统,推荐使用这些方式来管理和访问配置,而不是创建全局静态变量,因为这样可以更好地控制配置的加载和缓存。 4. **事件系统** Laravel的事件系统允许通过静态调用来...

    hibernate source compiled

    这使得开发者能够用面向对象的方式来处理数据库操作,而不是传统的SQL命令。 **编译型扫描** 在软件安全研究中,编译型扫描是一种静态分析技术,它涉及对已编译代码进行分析,以检测潜在的安全漏洞、错误或不良编程...

Global site tag (gtag.js) - Google Analytics