hibernate中Session常見操作

(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();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章