91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Hibernate SQLquery實現動態表

發布時間:2021-07-13 18:39:28 來源:億速云 閱讀:294 作者:chen 欄目:編程語言

這篇文章主要講解了“如何使用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實現動態表這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广平县| 长岛县| 平凉市| 邳州市| 谢通门县| 突泉县| 喀喇| 漯河市| 泰州市| 图木舒克市| 邳州市| 镇远县| 辽阳县| 饶平县| 广宗县| 胶南市| 微博| 宜兴市| 治县。| 惠水县| 会宁县| 博兴县| 台前县| 穆棱市| 莆田市| 南京市| 建湖县| 满洲里市| 大同市| 社会| 乌鲁木齐县| 秦安县| 丰都县| 苏尼特右旗| 探索| 临湘市| 永安市| 祥云县| 海城市| 普宁市| 海晏县|