1. 程式人生 > >hibernate-save方法詳解

hibernate-save方法詳解

Session的save()方法使一個臨時物件轉變為持久化物件。

例如以下程式碼儲存一個Customer物件:

        Customer customer = new Customer();
        customer.setId(new Long(9));// 為Customer臨時物件設定OID是無效的
        customer.setName("Tom");
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();

        session.save(customer);

        session.close();

    Session的save()方法完成以下的操作:

    (1)把Customer物件加入到快取中,使它變為持久化物件。

    (2)選用對映檔案指定的識別符號生成器為持久化物件分配惟一的OID。Customer.hbm.xml檔案中<id>元素的<generator>子元素指定識別符號生成器:
        <id name="id" column="ID">
            <generator class="increment"/>
        </id>
    以上程式試圖通過setId()方法為Customer臨時物件設定OID是無效的。假如起初CUSTOMERS表中沒有記錄,那麼執行完save()方法後,Customer物件的ID為1。如果希望由程式來為Customer物件指定OID,可以呼叫save()的另一個過載方法:

        save(customer, new Long(9));

    以上save()方法的第二引數顯示指定Customer物件的OID。這種形式的save()方法不推薦使用,尤其在使用代理主鍵的場合,不應該由程式為持久化物件指定OID。

    (3)計劃執行一個insert語句,把Customer物件當前的屬性值組裝到insert語句中:

        insert into CUSTOMERS(ID, NAME, ......) values(1, 'Tom', ......);

    值得注意的是,save()方法並不立即執行SQL insert語句。只有當Session清理快取時,才會執行SQL insert語句。如果在save()方法之後,又修改了持久化物件的屬性,這會使得Session在清理快取時,額外執行SQL update語句。

以下兩段程式碼儘管都能完成相同的功能,但是左邊程式碼僅執行一條SQL insert語句,而右邊程式碼執行一條SQL insert和一條SQL update語句。左邊程式碼減少了操作資料庫的次數,具有更好的執行效能。


        Customer customer = new Customer();         Customer customer = new Customer();

        // 先設定Customer物件的屬性,再儲存它       session.save(customer);

        customer.setName("Tom");                    // 先儲存Customer物件,再修改它的屬性

        session.save(customer);                     customer.setName("Tom");

        transaction.commit();                       transaction.commit();

    Hibernate通過持久化物件的OID來維持它和資料庫相關記錄的對應關係。當Customer物件處於持久化狀態時,不允許程式隨意修改它的OID,例如:
        Customer customer = new Customer();
        session.save(customer);
        customer.setId(new Long(100)); // 丟擲HibernateException
        transaction.commit();
    以上程式碼會導致Session在清理快取時丟擲異常。