dynamic-insert="true" dynamic-update="true"有玄机

Hibernate SQL优化小技巧使用dynamic-insert="true" dynamic-update="true"

最近正在拜读Hibernate之父大作《Java Persistence with Hibernate》,颇有收获。在我们熟悉的Hibernate映射文件中也大有乾坤,很多值得我注意的地方。
在Hibernate的映射文件的class tag使用dynamic-insert,dynamic-update,可以优化生成的Hibernate SQL语句,提高Hibernate SQL执行效率,最终可以提高系统性能。

如,有一个User类。

 
 
  1. public class User {     
  2.     /** Creates a new instance of User */  
  3.     public User() {  
  4.     }  
  5.     private long id;  
  6.     private int age;  
  7.  
  8.     private String firstname;  
  9.     private String lastname;  
  10.     private Set emailAddresses;  
  11. //省略getter 和setter方法  

Hibernate映射文件(User.hbm.xml,省略了文件头声明)定义为:

 
 
  1. <hibernate-mapping> 
  2.     <class name="model.User" table="Users" > 
  3.         <id name="id" column="ID"> 
  4.             <generator class="native"/> 
  5.         </id> 
  6.         <property name="age"/> 
  7.         <property name="firstname"/> 
  8.         <property name="lastname"/> 
  9.           
  10.         <set name="emailAddresses" table="PERSON_EMAIL_ADDR"> 
  11.             <key column="PERSON_ID"/> 
  12.             <element type="string" column="EMAIL_ADDR"/> 
  13.         </set> 
  14.     </class> 
  15. </hibernate-mapping> 

我们写一个测试类进行测试UserTest。

 
 
  1. public class UserTest extends TestCase {  
  2.       
  3.     public UserTest(String testName) {  
  4.         super(testName);  
  5.     }      
  6.     private Session session;  
  7.     private SessionFactory sessionFactory;  
  8.       
  9.     protected void setUp() throws Exception {  
  10.         sessionFactory=HibernateUtil.getSessionFactory();  
  11.         session=sessionFactory.openSession();  
  12.         session.getTransaction().begin();  
  13.     }     
  14.     protected void tearDown() throws Exception {  
  15.         session.getTransaction().commit();  
  16.         session.close();          
  17.     }     
  18.     /**  
  19.      * Test of getAge method, of class model.User.  
  20.      */  
  21.     public void testSaveUser() {  
  22.         System.out.println("================testSaveUser=================");  
  23.           
  24.         User user = new User();  
  25.         user.setAge(29);  
  26.         session.save(user);  
  27.         assertNotNull("id is assigned !",user.getId());  
  28.     }  
  29.     public void testUpdateUser() {  
  30.         System.out.println("================testUpdateUser=================");  
  31.           
  32.         User user = new User();  
  33.         user.setAge(29);  
  34.         session.save(user);  
  35.         assertNotNull("id is assigned !",user.getId());  
  36.           
  37.         User _user=(User) session.get(User.class, user.getId());  
  38.         _user.setFirstname("Array");  
  39.         session.update(_user);         
  40.     }      

运行测试后,此时会生成完整的Hibernate SQL语句(注意将hibernate属性show_sql设置成true)。

 
 
  1. ================testSaveUser=================  
  2. Hibernate: insert into Users (age, firstname, lastname) values (?, ?, ?)  
  3. ================testUpdateUser=================  
  4. Hibernate: insert into Users (age, firstname, lastname) values (?, ?, ?)  
  5. Hibernate: update Users set age=?, firstname=?, lastname=? where ID=? 

如果我们在<class ...>中加上 dynamic-insert="true" dynamic-update="true",变成如下。

 
 
  1. <class name="model.User" table="Users" dynamic-insert="true" dynamic-update="true"> 

再次运行测试类,就会发现生成的Hibernate SQL中涉及的字段只包含User类中修改的属性所对应的表字段。

 
 
  1. ================testSaveUser=================  
  2. Hibernate: insert into Users (age) values (?)  
  3. ================testUpdateUser=================  
  4. Hibernate: insert into Users (age) values (?)  
  5. Hibernate: update Users set firstname=? where ID=? 

如果一个表的结构很复杂,字段很多的情况下,使用dynamic-insert,dynamic-update能够性能上的少许提升。

 

http://developer.51cto.com/art/200906/130104.htm

含hibernate类介绍

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值