hibernate-save方法詳解
阿新 • • 發佈:2019-01-07
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在清理快取時丟擲異常。