天天看點

(轉)hibernate中的dynamic insert和dynamic update

在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="PERSON_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=(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: 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類中修改的屬性所對應的表字段。

Hibernate: insert into Users (age) values (?)

Hibernate: update Users set firstname=? where ID=?

如果一個表的結構很複雜,字段很多的情況下,使用dynamic-insert,dynamic-update能夠性能上的少許提升。

如果在session1中load一個po 然後在session2中 update 對不起 這樣不管用