bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

如何使用HibernateSQLquery實現動態表

這篇文章主要講解了“如何使用Hibernate SQLquery實現動態表”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何使用Hibernate SQLquery實現動態表”吧!

目前成都創新互聯公司已為成百上千家的企業提供了網站建設、域名、虛擬主機綿陽服務器托管、企業網站設計、隴南網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發展。

在實際的項目應用中,有時會設計出這樣的一種數據表,每個時間段產生一個新表,例如是按年或月或日。相同類型的表中,所有的字段結構都是一樣的。而 Hibernate 提供的類與表的映射,是只能映射到一個具體表的,在程序的運行過程中,很難去動態修改一個 hbm 對應的表名。我在網上也有看到一實現,但是很復雜,并且不符合我的要求。

因此我就想到直接用 jdbc 去操作數據庫,這樣的做法是繞過 Hibernate 了。方法是從 Hibernate 的 session 中,直接取得數據庫 connection ,然后就直接 jdbc 了。

后來在升級了 proxool 到 9.0RC3 后,發現居然出現了數據庫連接無法釋放的問題。為了解決這個問題,我查閱了 Hibernate doc。我發現原來用Hibernate SQLQuery 可以更好的解決,并且可以重新用于 Hibernate hbm 機制。以下舉例說明。

例如我有一個 pojo 是 ReadInfo,用來記錄閱讀信息的。由于數據量寵大,所以我的思路是按月劃分,每個月一張表。所以只是表名不同,而字段是完全相同的。

ReadInfo.java 是這樣的,其中 userId, year, month, day 是聯合主鍵:

private Integer userId;

private Integer year;

private Integer month;

private Integer day;

private Integer point ;

那么相應的 ReadInfo.hbm.xml 的片段是

< class name= "ReadInfo" table= "tblReadInfo " mutable = "false" >           < composite-id>               < key-property name= "userId" column= "userId" type= "integer" / >               < key-property name= "year" column= "year" type= "integer" / >               < key-property name= "month" column= "month" type= "integer" / >               < key-property name= "day" column= "day" type= "integer" / >           < / composite-id>           < property name= "point" column= "point" type= "integer" / >       < / class>

上面的xml,注意 2 個細節

1. pojo 所映射的 table tblReadInfo 實際上是不存在的。實際的表是 tblRead200710 之類的;

2. mutable 要設置為 false,即是說,關閉 Hibernate 對這個 pojo 的任何持久化操作,以避免 Hibernate 把數據寫到 tblReadInfo 中(這個表是不存在的嘛)。因此,所有的持久化操作,都是需要自己通過Hibernate SQLQuery 來處理。

現在可以看一下 ado 中的操作了,先看一個 select 操作

public ReadInfo selectReadInfo( Integer userId, Integer year,               Integer month, Integer day) throws HibernateException      {            ReadInfo readInfo = null ;             Session session = getSession ( ) ;           Transaction tx = session. beginTransaction( ) ;            try           {               String sql = "select * from tblRead"                   + Misc. formatMoon( year, month)                   + " where userId=? and day=?" ;                 SQLQuery query = session. createSQLQuery( sql ) ;               query . addEntity( ReadInfo. class ) ;                query . setLong ( 0, userId) ;               query . setInteger( 1, day) ;                 readInfo = ( ReadInfo) query . uniqueResult( ) ;                 tx. commit ( ) ;           }           catch ( HibernateException e)           {               log . error ( "catch exception:" , e) ;                if ( tx ! = null )               {                    tx. rollback ( ) ;               }                throw e;           }           return readInfo;       }

上面的代碼,關鍵是以下幾點:

1. 通過函數參數的 year, month 來確定要操作的表名,我自己寫了一個 Misc.formatMoon(year, month) 來生成 "yyyyMM" 格式的字串;

2. 使用了 SQLQuery ,再通過 query.addEntity(ReadInfo.class); 建立與 ReadInfo 的映射關系;

3. query.setXxx() 與 PreparedStatement 的類似,不過索引是從 0 開始;

4. 其它的就跟一般的 Query 操作類似的了。

再看一個 insert 操作

public void insertReadInfo( ReadInfo readInfo) throws HibernateException      {            Session session = getSession ( ) ;           Transaction tx = session. beginTransaction( ) ;            try           {               String sql = "insert into tblRead"                   + Misc. formatMoon( readInfo. getYear ( ) , readInfo. getMonth ( ) )                   + " (userId, year, month, day, point) values (?, ?, ?, ?, ?)" ;                 SQLQuery query = session. createSQLQuery( sql ) ;                query . setLong ( 0, readInfo. getUserId( ) ) ;               query . setInteger( 1, readInfo. getYear ( ) ) ;               query . setInteger( 2, readInfo. getMonth ( ) ) ;               query . setInteger( 3, readInfo. getDay ( ) ) ;               query . setInteger( 4, readInfo. getPoint ( ) ) ;                query . executeUpdate ( ) ;                 tx. commit ( ) ;           }           catch ( HibernateException e)           {               log . error ( "catch exception:" , e) ;                if ( tx ! = null )               {                    tx. rollback ( ) ;               }                throw e;           }       }

同理,update, delete 等操作也是這樣通過Hibernate SQLquery來實現的。

這種Hibernate SQLquery處理方式的麻煩的地方是需要手工寫 SQL,因此要盡量寫通用的標準SQL,不然在數據庫兼容方面會有問題。當然,有時是會出現無法兼容的情況,那么可以考慮把 SQL寫到配置文件中,根據不同的數據庫,裝載相應的配置文件。

感謝各位的閱讀,以上就是“如何使用Hibernate SQLquery實現動態表”的內容了,經過本文的學習后,相信大家對如何使用Hibernate SQLquery實現動態表這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創新互聯,小編將為大家推送更多相關知識點的文章,歡迎關注!

當前文章:如何使用HibernateSQLquery實現動態表
地址分享:http://vcdvsql.cn/article44/pdeche.html

成都網站建設公司_創新互聯,為您提供ChatGPT網站策劃網站制作關鍵詞優化網站內鏈App開發

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

小程序開發