| 
 | 
 
| 
 
 在我们熟悉的Hibernate映射文件中也大有乾坤,很多值得我注意的地方。 
在Hibernate的映射文件的class tag使用dynamic-insert,dynamic-update,可以优化生成的SQL语句,提高SQL执行效率,最终可以提高系统性能。 
如,有一个User类。 
 
 
    
public class User {     
        
    /** Creates a new instance of User */    
    public User() {     
    }     
    private long id;     
    private int age;     
    
    private String firstname;     
    private String lastname;     
    private Set emailAddresses;     
//省略getter 和setter方法     
}    
 
Hibernate映射文件(User.hbm.xml,省略了文件头声明)定义为: 
 
 
<hibernate-mapping>    
    <class name="model.User" table="Users" >    
        <id name="id" column="ID">    
            <generator class="native"/>    
        </id>    
        <property name="age"/>    
        <property name="firstname"/>    
        <property name="lastname"/>    
             
        <set name="emailAddresses" table=" ERSON_EMAIL_ADDR">    
            <key column="PERSON_ID"/>    
            <element type="string" column="EMAIL_ADDR"/>    
        </set>    
    </class>    
</hibernate-mapping>   
我们写一个测试类进行测试UserTest。 
 
 
 
 
public class UserTest extends TestCase {     
         
    public UserTest(String testName) {     
        super(testName);     
    }     
         
    private Session session;     
    private SessionFactory sessionFactory;     
         
    protected void setUp() throws Exception {     
        sessionFactory=HibernateUtil.getSessionFactory();     
        session=sessionFactory.openSession();     
        session.getTransaction().begin();     
    }     
         
    protected void tearDown() throws Exception {     
        session.getTransaction().commit();     
        session.close();     
             
    }     
         
    /**    
     * Test of getAge method, of class model.User.    
     */    
    public void testSaveUser() {     
        System.out.println("================testSaveUser=================");     
             
        User user = new User();     
        user.setAge(29);     
        session.save(user);     
        assertNotNull("id is assigned !",user.getId());     
    }     
    public void testUpdateUser() {     
        System.out.println("================testUpdateUser=================");     
             
        User user = new User();     
        user.setAge(29);     
        session.save(user);     
        assertNotNull("id is assigned !",user.getId());     
             
        User _user=(User) session.get(User.class, user.getId());     
        _user.setFirstname("Array");     
        session.update(_user);     
             
    }     
         
         
}    
运行测试后,此时会生成完整的SQL语句(注意将hibernate属性show_sql设置成true)。 
 
 
 
================testSaveUser=================     
Hibernate: insert into Users (age, firstname, lastname) values (?, ?, ?)     
================testUpdateUser=================     
Hibernate: insert into Users (age, firstname, lastname) values (?, ?, ?)     
Hibernate: update Users set age=?, firstname=?, lastname=? where ID=?   
如果我们在<class ...>中加上 dynamic-insert="true" dynamic-update="true",变成如下。 
 
 
 
<class name="model.User" table="Users" dynamic-insert="true" dynamic-update="true">   
再次运行测试类,就会发现生成的SQL中涉及的字段只包含User类中修改的属性所对应的表字段。 
 
 
 
================testSaveUser=================     
Hibernate: insert into Users (age) values (?)     
================testUpdateUser=================     
Hibernate: insert into Users (age) values (?)     
Hibernate: update Users set firstname=? where ID=?   
如果一个表的结构很复杂,字段很多的情况下,使用dynamic-insert,dynamic-update能够性能上的少许提升。 |   
 
 
 
 |