`

Hibernate4教程七:实战-概念整理

阅读更多
 (可忽略不看,都是些理论部分)
设计细颗粒度的持久类并且使用<component>来实现映射。
例如使用一个Address持久类来封装 street, suburb, state, postcode. 这将有利于代码重用和简化代码重构(refactoring)的工作。
对持久类声明标识符属性( identifier properties)
Hibernate中标识符属性是可选的,不过有很多原因来说明你应该使用标识符属性。我们建议标识符应该是“人造”的(自动生成,不涉及业务含义)。
使用自然键(natural keys)标识
对所有的实体都标识出自然键,用<natural-id>进行映射。实现equals()和hashCode(),在其中用组成自然键的属性进行比较。
为每个持久类写一个映射文件
不要把所有的持久类映射都写到一个大文件中。把 com.eg.Foo 映射到com/eg/Foo.hbm.xml中, 在团队开发环境中,这一点显得特别有意义。
把映射文件作为资源加载
把映射文件和他们的映射类放在一起进行部署。
考虑把查询字符串放在程序外面
如果你的查询中调用了非ANSI标准的SQL函数,那么这条实践经验对你适用。把查询字符串放在映射文件中可以让程序具有更好的可移植性。
使用绑定变量
就像在JDBC编程中一样,应该总是用占位符"?"来替换非常量值,不要在查询中用字符串值来构造非常量值!更好的办法是在查询中使用命名参数。
不要自己来管理JDBC connections
Hibernate允许应用程序自己来管理JDBC connections,但是应该作为最后没有办法的办法。如果你不能使用Hibernate内建的connections providers,那么考虑实现自己来实现org.hibernate.connection.ConnectionProvider
考虑使用用户自定义类型(custom type)
假设你有一个Java类型,来自某些类库,需要被持久化,但是该类没有提供映射操作需要的存取方法。那么你应该考虑实现org.hibernate.UserType接口。这种办法使程序代码写起来更加自如,不再需要考虑类与Hibernate type之间的相互转换。 
在性能瓶颈的地方使用硬编码的JDBC
在系统中对性能要求很严格的一些部分,某些操作也许直接使用JDBC会更好。但是请先确认这的确是一个瓶颈,并且不要想当然认为JDBC一定会更快。如果确实需要直接使用JDBC,那么最好打开一个 Hibernate Session 然后从 Session获得connection,按照这种办法你仍然可以使用同样的transaction策略和底层的connection provider。
理解Session清洗( flushing)
Session会不时的向数据库同步持久化状态,如果这种操作进行的过于频繁,性能会受到一定的影响。有时候你可以通过禁止自动flushing,尽量最小化非必要的flushing操作,或者更进一步,在一个特定的transaction中改变查询和其它操作的顺序。
在三层结构中,考虑使用托管对象(detached object)
当使用一个servlet / session bean 类型的架构的时候, 你可以把已加载的持久对象在session bean层和servlet / JSP 层之间来回传递。使用新的session来为每个请求服务,使用 Session.merge() 或者Session.saveOrUpdate()来与数据库同步。
在两层结构中,考虑使用长持久上下文(long persistence contexts).
为了得到最佳的可伸缩性,数据库事务(Database Transaction)应该尽可能的短。但是,程序常常需要实现长时间运行的“应用程序事务(Application Transaction)”,包含一个从用户的观点来看的原子操作。这个应用程序事务可能跨越多次从用户请求到得到反馈的循环。用脱管对象(与session脱离的对象)来实现应用程序事务是常见的。或者,尤其在两层结构中,把Hibernate Session从JDBC连接中脱离开,下次需要用的时候再连接上。绝不要把一个Session用在多个应用程序事务(Application Transaction)中,否则你的数据可能会过期失效。
不要把异常看成可恢复的
这一点甚至比“最佳实践”还要重要,这是“必备常识”。当异常发生的时候,必须要回滚 Transaction ,关闭Session。如果你不这样做的话,Hibernate无法保证内存状态精确的反应持久状态。尤其不要使用Session.load()来判断一个给定标识符的对象实例在数据库中是否存在,应该使用Session.get()或者进行一次查询.
对于关联优先考虑lazy fetching
谨慎的使用主动抓取(eager fetching)。对于关联来说,若其目标是无法在第二级缓存中完全缓存所有实例的类,应该使用代理(proxies)与/或具有延迟加载属性的集合(lazy collections)。若目标是可以被缓存的,尤其是缓存的命中率非常高的情况下,应该使用lazy="false",明确的禁止掉eager fetching。如果那些特殊的确实适合使用join fetch 的场合,请在查询中使用left join fetch。
使用open session in view模式,或者执行严格的装配期(assembly phase)策略来避免再次抓取数据带来的问题
Hibernate让开发者们摆脱了繁琐的Data Transfer Objects (DTO)。在传统的EJB结构中,DTO有双重作用:首先,他们解决了entity bean无法序列化的问题;其次,他们隐含地定义了一个装配期,在此期间,所有在view层需要用到的数据,都被抓取、集中到了DTO中,然后控制才被装到表示层。Hibernate终结了第一个作用。然而,除非你做好了在整个渲染过程中都维护一个打开的持久化上下文(session)的准备,你仍然需要一个装配期(想象一下,你的业务方法与你的表示层有严格的契约,数据总是被放置到托管对象中)。这并非是Hibernate的限制!这是实现安全的事务化数据访问的基本需求。
考虑把Hibernate代码从业务逻辑代码中抽象出来
把Hibernate的数据存取代码隐藏到接口(interface)的后面,组合使用DAO和Thread Local Session模式。通过Hibernate的UserType,你甚至可以用硬编码的JDBC来持久化那些本该被Hibernate持久化的类。 (该建议更适用于规模足够大应用软件中,对于那些只有5张表的应用程序并不适合。)不要用怪异的连接映射多对多连接用得好的例子实际上相当少见。大多数时候你在“连接表”中需要保存额外的信息。这种情况下,用两个指向中介类的一对多的连接比较好。实际上,我们认为绝大多数的连接是一对多和多对一的,你应该谨慎使用其它连接风格,用之前问自己一句,是否真的必须这么做。
偏爱双向关联
单向关联更加难于查询。在大型应用中,几乎所有的关联必须在查询中可以双向导航。
 
分享到:
评论

相关推荐

    Java就业培训教程

    根据提供的信息,“Java就业培训教程”是一本由张孝祥编写的教材,主要面向希望进入IT行业、专注于Java编程语言的求职者。虽然部分内容没有提供实际的章节或具体知识点,但我们可以基于标题和描述来推测这本教程可能...

    夏昕-Hibernate+开发指南.pdf

    本文档不仅是一份Hibernate的学习指南,也是作者多年实战经验的总结。通过阅读这份文档,开发者能够快速上手Hibernate框架,理解其核心概念,并掌握高级特性。同时,对于Hibernate在实际项目中的应用也有一定的指导...

    Hibernate开发实战讲解(源代码)源码整理

    《Hibernate开发实战讲解》源码解析 在Java领域,Hibernate是一个非常重要的持久化框架,它极大地简化了数据库操作,使得开发者能够专注于业务逻辑而非繁琐的数据交互。本篇将深入探讨Hibernate的核心概念,以及...

    系统分析师备考读书(学习)清单

    以上是根据提供的资料整理出的系统分析师备考相关的知识点概览。这些资源覆盖了从软件开发、计算机基础到数据库系统等多个方面,为备考提供了全面的知识支持。希望这些信息能够帮助到正在准备系统分析师考试的读者们!

    2019最新整理的黑马java视频教程

    【标题】"2019最新整理的黑马java视频教程" 涵盖了Java编程语言从基础到高级,以及企业应用开发的全方位学习资源。这个教程是为那些希望掌握Java技术并准备在IT行业就业的人群设计的,无论你是初学者还是有一定经验...

    hibernate官方入门教程 (转载)

    标题“hibernate官方入门教程 (转载)”表明这是一份关于Hibernate框架的基础教学资源,可能是从官方文档或者其他可靠来源整理而来的,适合初学者了解和学习Hibernate。 描述中提到的“NULL”意味着没有具体的描述...

    java学习笔记(文字整理版).doc

    通过对核心概念和技术点的详细解释,使学习者能够快速上手Java及Hibernate。 #### 二、Java基础知识概览 - **HelloWorld**:Java程序入门的第一个示例,用于展示如何在控制台输出“Hello World!”,是学习任何编程...

    java程序员 面试宝典

    这些只是面试宝典中可能涵盖的部分知识点,实际内容可能更加丰富,包括面试技巧、实战案例分析等,都是帮助Java程序员在面试中脱颖而出的重要资源。通过深入学习并理解这些内容,不仅可以提升面试成功率,也能为日常...

    2021JavaWEB就业编程实战教程[视频课程].txt打包整理.zip

    《2021JavaWEB就业编程实战教程》是一门针对JavaWeb开发的全面教程,旨在帮助学员提升在该领域的技能,以实现更好的就业前景。这门课程以视频形式呈现,结合了理论讲解与实践操作,使得学习过程更为直观生动。通过这...

    全套Java、Android、HTML5前端视频教程

    - **Hibernate4视频教程** - ORM技术原理。 - Hibernate配置与映射文件。 - 查询语言与缓存机制。 - **Spring4视频教程** - Spring框架核心容器。 - AOP与事务管理。 - MVC框架及集成测试。 - **SSH整合&...

    java面试题

    Java面试题是程序员在求职过程中经常会遇到的一种考核方式,它主要测试候选人在Java编程语言方面的基础知识、编程能力、...准备Java面试时,除了理论知识,还应注重实战经验和项目案例的分享,展示解决实际问题的能力。

    JAVA--3G-高级软件工程师包就业实战班『脱产』.doc

    ### JAVA--3G-高级软件工程师包就业实战班知识点解析 #### 一、课程概述 - **课程名称**:“JAVA--3G-高级软件工程师包就业实战班” - **课程定位**:本课程旨在培养具备高级技能的软件工程师,不仅掌握扎实的Java...

    公交查询系统毕业论文

    - **第3-4周**: 确定系统设计方案,完成开题报告。 - **第5-9周**: 学习相关技术知识,完成系统的设计工作。 - **第10-12周**: 上机实现系统功能,调试并优化代码。 - **第14周**: 撰写毕业论文,整理研究成果。 - *...

    java学习资源连接

    通过以上资源的整理和总结,我们可以看到Java学习资源十分丰富多样,既包括理论知识的学习,也包括实战经验的积累。对于初学者来说,可以先从基础知识入手,逐步过渡到实际项目;而对于有一定基础的开发者,则可以...

    hibernate学习资料大合集

    通过查阅这些文档,开发者可以了解到Hibernate的核心概念,如SessionFactory、Session、Transaction以及Entity、Criteria查询等。此外,还介绍了配置文件的设置、实体类的定义、映射文件的编写以及事务管理等关键...

    个人实用java、js个人资料

    - 面向对象:支持类、接口、继承、封装和多态等面向对象概念。 - 内存管理:通过垃圾回收机制自动管理内存,开发者无需手动释放。 - 平台无关性:通过JVM(Java虚拟机)实现跨平台运行。 2. JavaScript:最初由...

    Hibernate_PDF_超好

    首先,"精通Hibernate(孙卫琴).pdf"是孙卫琴老师的著作,该书系统地介绍了Hibernate的核心概念和实战技巧。书中涵盖的内容包括:Hibernate概述、环境配置、实体类与表的映射、对象状态管理、持久化操作、查询语言...

Global site tag (gtag.js) - Google Analytics