利用@DynamicInsert和@DynamicUpdate生成動態SQL語句

最近在使用Hibernate4中,發現兩個很有奧祕的註解 @DynamicInsert 和 @DynamicUpdate

如果是在配置文件的話那就是dynamic -insert 和 dynamic-update

這兩個註解在一定程度上可以增加與數據庫操作相關的速度,可以節省SQL語句的執行時間,提高程序的運行效率。

使用這兩個註解只需要在實體類上加入即可,或者在*.hbm.xml配置。這兩個註解是boolean值,true或者false。

 

1.首先使用false來看一下執行的結果,我們就拿更新來舉例:

  a.數據庫的數據是這樣的:

  

  b、實體類的代碼

  

    C、測試類代碼:

      

      執行測試方法後大家可以看到:

     

    我只更新了Description這個屬性,但是卻把整個對象的屬性都更新了,這在一定程度是影響了效率。而且可能並不是我們希望的結果,我們希望的結果是我更改了哪些
   字段就只要更新我修改的字段就可以了,接下來我們把@DynamicUpdate(false)改爲@DynamicUpdate(true) 測試一下 ,結果如下

   

   神奇了,這就是見證奇蹟的時刻,達到了我們的目的,只更新我們修改過的字段。@DynamicInsert我就不舉例了。

   測試之後可以知道:

   在hibernate中可以利用@DynamicInsert和@DynamicUpdate生成動態SQL語句,即在插入和修改數據的時候,語句中只包括要插入或者修改的字段。

   當然還有其他的方式達到這種效果,比如使用session爲我們提供的merge方法,也是可以的。

-------------------------------------------------------------------------------------------

@DynamicUpdate(true) @DynamicInsert(true)使用的環境

1、要在同一個session裏面纔有效;

2、子類不能繼承到@DynamicUpdate(true)註解
@DynamicUpdate(true) <wbr>@DynamicInsert(true)使用的環境,

3.@DynamicInsert(true) :只是插入那些不爲空的字段,@DynamicUpdate(true):只更新同一個session裏面,同一個對象有改變的字段。

4.sessionFactory.getCurrentSession()和sessionFactory.openSession()的區別:

3.1 getCurrentSession ()  使用當前的 session

注意:1,使用 SessionFactory.getCurrentSession() 需要在hibernate.cfg.xml 中如下配置:

   如果採用 jdbc 獨立引用程序配置如下:
    thread
   如果採用了 JTA事務配置如下  
    jta

2,使用的是 getCurrentSession 來創建session 的話,在 commit 後,session 就自動被關閉了,也就是不用再session.close() 了。

3.2 openSession()  重新建立新的session 

注意:1,使用的是 openSession 來創建 session的話,在 commit 後,session 必須顯示的關閉,也就是調用 session.close() 方法。

在應用程序中,如果 DAO 層使用 Spring 的 hibernate 模板,通過 Spring 來控制 session的生命週期,則應該 getCurrentSession ()。 

----------------------------------------------------------------------------------------------------------------------------------------------

http://blog.csdn.net/u010161082/article/details/46469753

最近新搭了個項目,是用maven構建springmvc+hibernate+junit+easyui。是用註解的方式。

前幾天在一個博客(http://www.cnblogs.com/quanyongan/p/3152290.html)上看到@DynamicInsert(true) @DynamicUpdate(true)的用法,達到了只更新我們修改過的字段,故引入這兩個註解。但直到今天才開始進行測試,單元測試代碼如下:



測試之後發現,無論是插入的值,還是更新的值都沒有同步到數據表中,經過百度一下,才知道問題所在:單元測試是用AbstractTransactionalJUnit4SpringContextTests進行的,而AbstractTransactionalJUnit4SpringContextTests執行默認是會回滾,可能是爲了避免出現髒數據吧!故加@Rollback(false)即可!!!



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