hibernate优化方法,hibernate性能优化
我相信大家都在用hibernate(我这里用的是3.6,因为我更喜欢spring,但是hibernate4.x和未来的spring有很多相似之处。而且spring也认为hibernate4.x是一个很完善的框架,从spring3.x开始很多hibernate支持类都被放弃了,所以我就不升级hibernate了),也就是说在配置hibernate映射文件的时候,如果有一对多(或者多对多)的属性,hinernate提供了一个优化机制,lazy属性,但是问题是配置文件是一次性配置的。如果我的项目中有些地方需要延迟加载,有些地方不需要,那么必须强制lazy=false,这样一来
经过一段时间的经验积累,我们终于有了一套可行的方案:
默认情况下,项目中的所有惰性属性都设置为true,不再设置为false。项目中添加了一个commonService,它提供了两种方法,一种是查询单个对象,另一种是查询列表:
@覆盖
公共对象findById(类。Objclass,类?idClass,对象id,String[]字段){
Object o=dao.findById(Objclass,(Serializable)id class . cast(id));
if(字段!=null){
for(字符串字段:字段){
string target method= get upper first word(field);
method[]methods=obj class . getdeclaredmethods();
for(方法m:方法){
if(m.getName()。equals(targetMethod)){
尝试{
hibernate . initialize(m . invoke(o));
打破;
} catch(异常e) {
e . printstacktrace();
返回o;
}
Objclass字段需要查询的对象的classidClass id字段的type id的值需要初始化。
公共列表?找(类?entityClazz,QueryParameterSetter paraSetter,Sorter sorter,Page page,String[] fields) {
DetachedCriteria DC=DetachedCriteria . for class(entity clazz);
如果(paraSetter!=空)
parasetter . set parameters(DC);
如果(分拣员!=null sorter.getOrder()!=空)
DC . add order(sorter . get order());
列表?l=findpagelistbycredirect(DC,page.getPageSize()、page . getrecordstartindex());
lazyInitialize(entityClazz,l,fields);
返回l;
private void lazyInitialize(类。entityClazz,List?l,String[]字段){
if(字段!=null){
for(字符串字段:字段){
string target method= get upper first word(field);
method[]methods=entity clazz . getdeclaredmethods();
for(方法m:方法){
if(m.getName()。equals(targetMethod)){
尝试{
对于(对象o:l){
hibernate . initialize(m . invoke(o));
} catch(异常e) {
e . printstacktrace();
}
EntityClazz实体类型paraseter参数集接口排序器排序页面分页对象
需要初始化的字段
这样在项目中,需要加载相关对象数据的人只需要使用这两种方法,并且可以指定属性,所以性能大大提高。
这里只是一个代码片段,相信大部分程序员都能看懂。至于那些看不懂的程序员,自己考虑吧。