(1) delete(Object o):用於刪除指定的一個對象。只要對象設置了Id就可以delete。
需要注意的是如果數據庫沒有該對象,那麼調用delete方法也不會報任何錯誤,因此爲了明確是否有刪除,還是會先判斷是否存在該對象,而往往會把找到的對象作爲返回值。
(2) save(Object o):用於將一個對象o持久化。
需要注意的是直接調用該方法,如果數據庫中已經存在該主鍵對應的對象,那麼就會報錯,所以爲了避免出現客戶端看不到的錯誤,通常是先判斷數據庫中是否已經存在該對象,如果有就不再調用save方法,而是告訴用戶”該對象已經存在”,沒有才調用save方法。
(3) load(Class, 對象的主鍵):用於查找指定的一個對象,如:
Teacher t = (Teacher)session.load(Teacher.class, 1);
生成的不是Teacher類,而只是一個代理(Teacher類的一個子類)
get(Class, 對象的主鍵):用於查找指定的一個對象,如:
Teacher t = (Teacher)session.get(Teacher.class, 1);
不同之處:load生成的只是對象的一個代理,即還不會生成sql語句真正執行,只有真正要用到對象時(例如:System.out.println(t.getName())),纔會發出sql語句並執行。所以如果數據庫中沒有要找的對象,那麼load方法執行後是不會報錯的,而get方法則會報錯。因此使用get方法時還是最後先檢查數據庫是否已經存在該對象。
(4) createQuery(String sql):也是用於查找對象,不過比較靈活,能夠根據給出的具體的條件進行查找。例如,判斷一個對象是否已經存在數據庫中:
Configuration cf = new AnnotationConfiguration();
SessionFactory sessionFactory
= cf.configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Query querySql = session.createQuery("from Member m where m.id
= :id and m.name = :name");
querySql.setParameter("id", m.getId());
querySql.setParameter("name", m.getName());
List<Member> members = (List<Member>) querySql.list();
session.getTransaction().commit();
if(members.size() > 0) {
return true;
} else {
return false;
}
(5) update(Object o):可以更新一個detached對象,更新完後轉爲persistence對象,但不能更新一個transient對象,可以更新自己設定Id後的對象。而由於該方法是更新表中所有字段的,所以效率往往會很低,尤其是存在某些字段特別長的時候。可以通過以下方式解決:
l 在annotation中對不想更新的字段(往往是特別長的那個字段)加註解:@Column(updatable=flase);
l 在xml文件字段的<property>標籤里加入屬性:update=”false”,例如:
<property name=”title” update=”false”></property>,不過這種方式比較少用,不靈活;
l 在對應實體的xml配置文件的<class>標籤里加入dynamic-update=”true”,表示字段沒有變化就不更新,有變化才更新,如:
<class name=”com.yilong.hibernate.Student” dynamic-update=”true”>
只改變Student中的name字段的情況。
l 使用HQL(EJBQL)(面向對象的查詢語言)語句,例如:(import org.hibernate.Query)
Query q = session.createQuery(“update Student s set s.name=’z5’
where s.id=1”);
q.executeUpdate();