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(); 

相关推荐