前言:本文适合对hibernate有一定了解的人,未了解hibernate的读者可能会有点困难。众所周知,hibernate是个十分强大的ORM框架,然而越强大的东西规则就越多,hibernate也是,hibernate用得好那就是如虎添翼,用的不好会严重拖累系统性能,还不如直接用java的JDBC编程。我的博客主要写的是我在学习hibernate的过程中学习到的优化建议方法。将持续改进和更新。有一本畅销书《精通hibernate:java持久化对象技术详解》,写的非常好,本文章是个人的读书笔记。
一.基础优化建议
1.id一般都是用Long型。
2.包装类优先:由于在数据库中存在许多null值,在插入数据的时候也会有如果有某字段没有赋值就会默认为空,既然数据库支持,那hibernate也应该支持,所以一般在使用hibernate传参入到数据库的时候都使用包装类,因为包装类允许null值。典型的例如:session.get(Cunstom.class,new Long(1)),除此之外,类里面的属性定义都应该是用包装类类定义,比如使用Integer price;而不是int price。
3.访问类属性策略:在
<property name=”name” column=”NAME” access=”field”/>
中配置access=”field”之后,hibernate就会直接访问该实例的name属性,而不是调用该方法。(需要注意的是,hibernate是通过反射访问属性的,所以不论变量的修饰符是public还是private,hibernate都能访问)。access的另一个值是property,默认值,一般不用配置,表示hibernate通过市里的setXXX和GetXXX来访问属性。
4.派生属性:
<property name=”totalPrice” formula=”(select sum(0.price) from ORDERS o where o.CUSTEMER_ID=ID)”/>
在查询customer对象时,select语句会包含以上用于计算派生属性的子查询语句:
select ID,NAME,SEX,`CUSTOMER DESCRIPTION`,( select sum(0.price) from ORDERS o where o.CUSTEMER_ID=1) from CUSTOMERS。
(ps:上面这个“`CUSTOMER DESCRIPTION` “符号是引用标示符,如果字段名中包含空格或者特殊字符那么就需要使用这个引用标示符)
5.property的映射属性:
insert属性:如果为false表示该字段永远不能被插入,默认为true;
update属性:如果为false表示该字段永远不能被更新,默认为true;
class的映射属性:
dynamic-insert属性:如果为true,表示每当保存一个对象时,会动态生成insert语句,insert语句仅包含所有取值不为null的字段,默认值false.
dynamic-update 属性:如果为true,表示每当更新一个对象时,会动态生成update语句,在update语句中仅包含所有取值需要更新的字段。
Tip:一般建议把dynamic-insert属性和dynamic-update 属性设置为true,这样可以节省数据库sql查询时的系统开销。
6.比较对象是否相等:
先看如下代码:
Customer c1=new Customer(“Tom”); Customer c2=new Customer(“Tome”); Cusomer c3=c1;
如果打印”c1==c2”或者”c1.equals(c2)”结果都是false,这样应该是不对的,他俩应该是相等的,所以我们建议在类中重写equals方法以方便比较两个对象是否相等。如下:
public Boolean equals(Object o){ if(this == o) return true; if(!(o instanceof CustomerId)) return false; final CustomerId other = (CustomerId) o; if(!this.getName.equals(other.getName()) return false; if(!companyId.equals(other.getCompanyId())) return false; return true; }
7.hibernate用OID来区分对象,该OID实际是关系映射文件中的id项,如下:
<id name=”MemoId” type=”Long” column=”ID”> <generator class=”increament”/> </id>
8.hibernate的标示符生成器:
increament (常用): 由hibernate 自动以递增的方式生产标识符,每次增量为1;
identity:由数据库底层生产标识符;
sequence:由底层的序列来生产标识符,注意少数数据库可能不支持,例如mysql;
hilo:hibernate根据high/low算法来生成标识符;
native: 根据底层数据库对自动生成标识符的支持能力,来选择identity,sequence,hilo;
uuid.hex: hibernate采用128位UUID来生成算法标识符,UUID能够在网络环境中生成唯一的字符串标识符,但占用太多空间,一般不推荐;
assigned:自然主键,由java生成。一般不推荐;
foreign:用另一个关联的对象的标识符来作为当前对象的标识符,主要适用于一对一关联的场合。
相关推荐
* 如果一个项目中,对 SQL 语句的优化的要求比较高,这个时候不能用 Hibernate 来做 * 表之间的关系很复杂的情况下,不能用 Hibernate 来操作 * 如果一张表的数据超过了千万级别也不适合用 Hibernate 来做 ...
以上便是对Hibernate基础的概览,实际开发中,还需要深入了解实体关系映射、集合映射、级联操作、缓存机制、事务管理、性能优化等方面的知识,才能更好地利用Hibernate提升开发效率并保证应用程序的稳定运行。...
《马士兵Hibernate学习笔记》是一份深入浅出的教程,旨在帮助初学者掌握Hibernate这一流行的Java持久化框架。Hibernate是一个对象关系映射(ORM)工具,它允许开发者用面向对象的方式来操作数据库,从而减少了传统...
9. 性能优化:最后,笔记会探讨一些Hibernate的性能优化技巧,如批处理、缓存策略、延迟加载的合理使用等,以提高应用程序的运行效率。 总之,《韩顺平.2011版.hibernate笔记》全面地介绍了Hibernate的各个方面,...
- **Hibernate**:一种开放源代码的对象关系映射解决方案。 - **TopLink**:Oracle公司的对象关系映射工具,后来成为EclipseLink的一部分。 - **JDO (Java Data Objects)**:Java标准的一种持久化技术,提供了一...
3. **Criteria API**:一种动态查询方式,允许在运行时构建查询,无需编写SQL语句。它可以方便地实现复杂的查询条件和排序。 4. **HQL(Hibernate Query Language)**:Hibernate特有的面向对象的查询语言,类似于...
本笔记涵盖了Hibernate的基础概念、核心功能以及实际应用,旨在帮助开发者快速理解和掌握Hibernate。 笔记内容可能包括以下几个方面: 1. **Hibernate概述**:介绍Hibernate的发展历程、设计理念以及在Java开发中...
本笔记涵盖了Hibernate框架的基础知识和使用技巧,从HelloWorld开始,逐步深入到ORM(对象关系映射)原理、配置、核心接口、对象状态、关系映射、查询语言HQL,以及在实际项目中的应用如在Struts中的整合和性能优化...
【尚学堂Hibernate学习笔记】是一份详尽的学习资料,旨在帮助初学者理解并掌握Hibernate这一流行的Java对象关系映射(ORM)框架。该笔记由作者根据马士兵老师的教程整理而成,其中包含了个人的学习注解,使得内容...
本文将根据马士兵的Hibernate学习笔记,深入探讨Hibernate的核心概念、配置、查询及性能优化等方面的知识。 首先,我们需要理解什么是O/R Mapping(对象关系映射)。在传统的JDBC编程中,我们直接通过SQL与数据库...
### 马士兵 Hibernate 学习笔记概览 #### 一、Hello World 示例 - **简介**:通过简单的示例程序来快速入门 Hibernate 框架。 - **步骤**: 1. 创建 Java 项目 `hibernate_0100_HelloWorld`。 2. 构建 User-...
2016年版本的Hibernate在继承了其早期版本的优秀特性基础上,又进行了一些改进和优化,使得其更加适合现代应用程序的需求。 首先,我们需要理解Hibernate的核心概念——对象关系映射(ORM)。ORM是将数据库中的表...
3. Transaction:事务管理是数据库操作的基础,Hibernate提供了一种便捷的方式来处理事务,确保数据的一致性。 4. Cache:Hibernate内置了二级缓存机制,包括一级缓存Session和二级缓存SessionFactory,提高了数据...
在本课程中,我们将深入探讨Hibernate框架的基础知识,这是一个流行的Java对象关系映射(ORM)工具,它简化了数据库与Java应用程序之间的交互。我们的重点是Hibernate 3.1版本,虽然较旧,但仍然是许多项目中的基石...
在JDBC(Java Database Connectivity)的基础上,Hibernate 提供了面向对象的编程模型,减少了与数据库交互时的繁琐代码,提高了开发效率。以下是关于Hibernate的一些关键知识点: ### 1. JDBC 的优缺点 **JDBC的...
【hibernate个人学习笔记完整版】是一份详尽的资料,涵盖了Hibernate框架的基础到高级应用,旨在帮助学习者深入理解和掌握这一强大的Java对象关系映射(ORM)工具。Hibernate作为Java开发中的主流ORM框架,它极大地...