Hibernate性能优化
使用dynamic-insert与dynamic-update
动态的添加与更新
1)<property>元素insert属性:设置为false,在insert语句中不包含这个字段,表示永远不会被插入,默认true
2)<property>元素update属性:设置为false,在update语句中不包含这个字段,表示永远不会被修改,默认true
3)<class>元素mutable属性:设置为false就是把所有的<property>元素的update属性设置为了false,说明这个对象不会被更新,默认true
4)<property>元素dynamic-insert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false
5)<property>元素dynamic-update属性,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false
6)<class>元素dynamic-insert属性:设置为true,表示把所有的<property>元素的dynamic-insert属性设置为true,默认false
7)<class>元素dynamic-update属性:设置为true,表示把所有的<property>元素的dynamic-update属性设置为true,默认false
Xml代码
1.<classname="com.rbh,examples.Testbook"table="TESTBOOK"
2.dynamic-insert="true"dynamic-update="true">
3.</class>
4.</hibernate-mapping>
<classname="com.rbh,examples.Testbook"table="TESTBOOK"
dynamic-insert="true"dynamic-update="true">
</class>
</hibernate-mapping>
延迟加载(LazyLoading)
Hibernate为了避免在关联查询中所带来的无谓的性能开销,使用了延迟加载技术,就是在真正需要读取数据的时候,才向数据库执行数据库的读取加载操作.
1.持久化对象的延迟加载(默认都为true)
Xml代码
1.<hibernate-mapping>
2.<classname="com.rbh.examples.Category"table="CATEGORY"lazy="true">
3.</class>
4.</hibernate-mapping>
<hibernate-mapping>
<classname="com.rbh.examples.Category"table="CATEGORY"lazy="true">
</class>
</hibernate-mapping>
2.集合对象的延迟加载(默认都为true)
Xml代码
1.<classname="com.rbh.examples.Category"table="CATEGORY"lazy="true">
2.<setname="products"cascade="save-update"inverse="true"lazy="true">
3.<keycolumn="category_id"/>
4.<one-to-manyclass="com.rbh.examples.Product"/>
5.</set>
6.</class>
<classname="com.rbh.examples.Category"table="CATEGORY"lazy="true">
<setname="products"cascade="save-update"inverse="true"lazy="true">
<keycolumn="category_id"/>
<one-to-manyclass="com.rbh.examples.Product"/>
</set>
</class>
3.属性的延迟加载(默认为false)还要对持久化的类做曾强处理
Xml代码
1.<classname="com.rbh.examples.Category"table="CATEGORY"lazy="true">
2.<propertyname="image"type=java.sql.Clob"column="IMAGE"lazy="true">
3.</class>
<classname="com.rbh.examples.Category"table="CATEGORY"lazy="true">
<propertyname="image"type=java.sql.Clob"column="IMAGE"lazy="true">
</class>
解决org.hibernate.LazyInitializationException
1.取消延迟加载(忽略)
2.使用Hibernate.initialize()
3.使用OpenSessionInview设计模式
集合对象的抓取策略(Fetchingstrategies)
查询抓取
Xml代码
1.<setname="products"cascade="save-update"inverse="true"fetch="select">
2.<keycolumn="category_id"/>
3.<one-to-manyclass="com.rbh.examples.Product"/>
4.</set>
<setname="products"cascade="save-update"inverse="true"fetch="select">
<keycolumn="category_id"/>
<one-to-manyclass="com.rbh.examples.Product"/>
</set>
Java代码
1.//fetch=select,lazy=true
2.Sessionsession=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
3.Transactiontx=session.beginTransaction();
4.Categorycategory=(Category)session.load(Category.class,newInteger(1));
5.System.out.println(category.getName());
6.
7.Iterator<Product>it=category.getProducts().iterator();
8.Productp=null;
9.while(it.hasNext()){
10.p=it.next();
11.System.out.println(p.getName());
12.}
13.tx.commit();
//fetch=select,lazy=true
Sessionsession=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
Transactiontx=session.beginTransaction();
Categorycategory=(Category)session.load(Category.class,newInteger(1));
System.out.println(category.getName());
Iterator<Product>it=category.getProducts().iterator();
Productp=null;
while(it.hasNext()){
p=it.next();
System.out.println(p.getName());
}
tx.commit();使用HQL语句或者Criteria对象重载抓取策略
Java代码
1.//fetch=select,lazy=true,HQL重载
2.Sessionsession=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
3.Transactiontx=session.beginTransaction();
4.
5.Queryquery=session
6..createQuery("selectcfromCategorycinnerjoinfetchc.productswherec.id=?");
7.query.setInteger(0,newInteger(1));
8.Categorycategory=(Category)query.uniqueResult();
9.
10.System.out.println(category.getName());
11.
12.Iterator<Product>it=category.getProducts().iterator();
13.Productp=null;
14.while(it.hasNext()){
15.p=it.next();
16.System.out.println(p.getName());
17.}
18.
19.tx.commit();
//fetch=select,lazy=true,HQL重载
Sessionsession=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
Transactiontx=session.beginTransaction();
Queryquery=session
.createQuery("selectcfromCategorycinnerjoinfetchc.productswherec.id=?");
query.setInteger(0,newInteger(1));
Categorycategory=(Category)query.uniqueResult();
System.out.println(category.getName());
Iterator<Product>it=category.getProducts().iterator();
Productp=null;
while(it.hasNext()){
p=it.next();
System.out.println(p.getName());
}
tx.commit();
子查询抓取
Xml代码
1.<setname="products"cascade="save-update"inverse="true"fetch="subselect">
2.<keycolumn="category_id"/>
3.<one-to-manyclass="com.rbh.examples.Product"/>
4.</set>
<setname="products"cascade="save-update"inverse="true"fetch="subselect">
<keycolumn="category_id"/>
<one-to-manyclass="com.rbh.examples.Product"/>
</set>
Java代码
1.//fetch=subselect,lazy=true
2.Sessionsession=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
3.Transactiontx=session.beginTransaction();
4.
5.Listcategorys=session.createQuery("fromCategory").list();
6.for(Iterator<Category>it=categorys.iterator();it.hasNext();){
7.Categorycategory=it.next();
8.System.out.println(category.getName());
9.for(Iterator<Product>it2=category.getProducts().iterator();it2.hasNext();){
10.Productproduct=it2.next();
11.System.out.println(product.getName());
12.}
13.}
14.tx.commit();
//fetch=subselect,lazy=true
Sessionsession=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
Transactiontx=session.beginTransaction();
Listcategorys=session.createQuery("fromCategory").list();
for(Iterator<Category>it=categorys.iterator();it.hasNext();){
Categorycategory=it.next();
System.out.println(category.getName());
for(Iterator<Product>it2=category.getProducts().iterator();it2.hasNext();){
Productproduct=it2.next();
System.out.println(product.getName());
}
}
tx.commit();连接查询抓取
Xml代码
1.<setname="products"cascade="save-update"inverse="true"fetch="join">
2.<keycolumn="category_id"/>
3.<one-to-manyclass="com.rbh.examples.Product"/>
4.</set>
<setname="products"cascade="save-update"inverse="true"fetch="join">
<keycolumn="category_id"/>
<one-to-manyclass="com.rbh.examples.Product"/>
</set>
Java代码
1.//fetch=join,lazy=true
2.Sessionsession=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
3.Transactiontx=session.beginTransaction();
4.Categorycategory=(Category)session.load(Category.class,newInteger(1));
5.System.out.println(category.getName());
6.
7.Iterator<Product>it=category.getProducts().iterator();
8.Productp=null;
9.while(it.hasNext()){
10.p=it.next();
11.System.out.println(p.getName());
12.}
13.tx.commit();
//fetch=join,lazy=true
Sessionsession=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
Transactiontx=session.beginTransaction();
Categorycategory=(Category)session.load(Category.class,newInteger(1));
System.out.println(category.getName());
Iterator<Product>it=category.getProducts().iterator();
Productp=null;
while(it.hasNext()){
p=it.next();
System.out.println(p.getName());
}
tx.commit();批量抓取
Xml代码
1.<setname="products"cascade="save-update"inverse="true"batch-size="5">
2.<keycolumn="category_id"/>
3.<one-to-manyclass="com.rbh.examples.Product"/>
4.</set>
<setname="products"cascade="save-update"inverse="true"batch-size="5">
<keycolumn="category_id"/>
<one-to-manyclass="com.rbh.examples.Product"/>
</set>
Java代码
1.//fetch=batch,lazy=true
2.Sessionsession=HibernateSessionFactoryUtil.getSessionFactory().getCurrentSession();
3.Transactiontx=session.beginTransaction();
4.
5.List<Category>categorys=session.createQuery("fromCategory").list();
6.System.out.println(categorys.get(3).getProducts());
7.System.out.println(categorys.get(0).getProducts());
8.
9.tx.commit();