Hibernate在對資料庫進行操作之前,必須先取得Session實例,相當於JDBC在對資料庫操作之前,必須先取得Connection實例, Session是Hibernate操作的基礎,它不是設計為執行緒安全(Thread-safe),一個Session由一個執行緒來使用。
Session實例由SessionFactory開啟獲得,例如:
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
....
session.close();
透過Session,可以對資料庫進行新增、刪除、更新,例如使用save()新增一筆資料:
User user = new User();
user.setName("momor");
user.setAge(new Integer(26));
session.save(user);
使用get()或load()方法取得id為1的資料:
User user = (User) session.get(User.class, new Integer(1));
如果未能發現相符合的資料,則get()方法會返回null,而load()方法會丟出ObjectNotFoundException,在進階的應用中,load()方法可以返回代理物件,並可充分利用緩衝機制。
在Hibernate 3中,取消了find()方法,您必須透過Query或Criteria來進行資料查詢。
接下來看看使用Session更新與刪除資料,可使用delete()刪除資料:
User user = (User) session.get(User.class, new Integer(1));
session.delete(user);
如果您開啟了一個Session,從資料表中取出資料顯示到使用者介面上,之後關閉Session,當使用者在介面上操作完畢並按下儲存時,這時您要重新開啟一個Session,使用update()方法將物件中的資料更新至對應的資料表中:
User user = (User) session.get(User.class, new Integer(2));
session.close();
....
user.setAge(new Integer(27));
session = sessionFactory.openSession();
Transaction tx= session.beginTransaction();
session.update(user);
tx.commit();
session.close();
Session提供了一個saveOrUpdate()方法,為資料的儲存或更新提供了一個統一的操作介面,藉由定義映射文件時,設定<id>標籤的unsaved-value來決定什麼是新的值必需,什麼是已有的值必須更新:
<id name="id" column="id" type="java.lang.Integer" unsaved-value="null">
<generator class="native"/>
</id>
unsaved-value可以設定的值包括:
- any:總是儲存
- none:總是更新
- null:id為null時儲存(預設)
- valid:id為null或是指定值時儲存
這樣設定之後,您可以使用Session的saveOrUpdate()方法來取代update()方法。