(一)hibernate 优化笔记:基础

标签: hibernate 优化 笔记 | 发表时间:2014-09-06 15:12 | 作者:DavidIsOK
出处:http://www.iteye.com

前言:本文适合对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:用另一个关联的对象的标识符来作为当前对象的标识符,主要适用于一对一关联的场合。

 

二.hibernate的映射:一对多关联关系



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hibernate 优化 笔记] 推荐:

(一)hibernate 优化笔记:基础

- - 企业架构 - ITeye博客
前言:本文适合对hibernate有一定了解的人,未了解hibernate的读者可能会有点困难. 众所周知,hibernate是个十分强大的ORM框架,然而越强大的东西规则就越多,hibernate也是,hibernate用得好那就是如虎添翼,用的不好会严重拖累系统性能,还不如直接用java的JDBC编程.

hibernate优化

- - 开源软件 - ITeye博客
原文 http://developer.51cto.com/art/200906/129539.htm. 文章分为十三个小块儿对Hibernate性能优化技巧进行总结性分析,分析如下:. 一、在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数据量的,可以使用session.

Hibernate性能优化技巧

- - SQL - 编程语言 - ITeye博客
文章分为十三个小块儿对Hibernate性能优化技巧进行总结性分析,分析如下:. 一、在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数据量的,可以使用session. clear()或者session. evict(Object) 在处理过程中,清除全部的缓存或者清除某个对象.

hibernate优化总结(转自一博客)

- - 企业架构 - ITeye博客
1) 在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数据量的,可以使用session.clear()或者session. Evict(Object) 在处理过程中,清除全部的缓存或者清除某个对象. 2) 对大数据量查询时,慎用list()或者iterator()返回查询结果,.

hibernate复习(1)性能优化之抓取策略

- - CSDN博客互联网推荐文章
抓取策略(fetching strategy) 是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略. 抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL 或条件查询(Criteria Query)中重载声明. 通过配置抓取策略可以直接影响Session的get()和load()方法的查询效率.

性能优化之Hibernate缓存讲解、应用和调优

- - CSDN博客系统运维推荐文章
    近来坤哥推荐我我们一款性能监控、调优工具——JavaMelody,通过它让我觉得项目优化是看得见摸得着的,优化有了针对性. 而无论是对于分布式,还是非分布,缓存是提示性能的有效工具.     数据层是EJB3.0实现的,而EJB3.0内部也是通过Hibernate实现的,而Hibernate本身提供了很好的缓存机制,我们只需要学会使用它驾驭它就够了.

Spring/Hibernate 应用性能优化的7种方法

- - IT瘾-geek
【编者按】对于大多数典型的 Spring/Hibernate 企业应用而言,其性能表现几乎完全依赖于持久层的性能. 此篇文章中将介绍如何确认应用是否受数据库约束,同时介绍七种常用的提高应用性能的速成法:. 如何确认应用是否受限于数据库. 确认应用是否受限于数据库的第一步,是在开发环境中进行测试,并使用 VisualVM 进行监控.

Hibernate面试题

- - ITeye博客
什么是Hibernate的并发机制. Hibernate并发机制:. a、Hibernate的Session对象是非线程安全的,对于单个请求,单个会话,单个的工作单元(即单个事务,单个线程),它通常只使用一次,. 如果一个Session 实例允许共享的话,那些支持并发运行的,例如Http request,session beans将会导致出现资源争用.

Hibernate Lazy属性

- - 博客园_首页
  Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术. 这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录. 通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销. Hibernate 的延迟加载本质上就是代理模式的应用,当程序通过 Hibernate 装载一个实体时,默认情况下,Hibernate 并不会立即抓取它的集合属性、关联实体所以对应的记录,而是通过生成一个代理来表示这些集合属性、关联实体,这就是代理模式应用带来的优势.

Hibernate 缓存

- - ITeye博客
1数据缓存:(date caching) 是一种将数据暂时存于内存缓存去中的技术,缓存通常是影响系统性能的关键因素. 2.ORM的数据缓存策略有3中.   1.事务级缓存:  分为 数据库事务和 应用级事务,是基于Session的生命周期的实现,每个session都会在内部维持一个数据缓存, 随session的创建和消亡.