1 Hibernate 連接池

   hibernate自帶一個連接池,但是這個連接池的性能不好,BUG也比較多,所以hibernate借助第三方的連接池來配置。通常用的比較多的是prxool。目前在j2ee中最通用的框架ssh中,hibernate的配置如下:

  spring applicationContext.xm.配置文件里配置數(shù)據(jù)源連接信息:

<!-- 配置數(shù)據(jù)源 -->

   <bean id="dataSource"

class="org.springframework.jdbc.datasource.DriverManagerDataSource">

     <property name="driverClassName">

   <value>org.logicalcobwebs.proxool.ProxoolDriver</value>

     </property>

     <property name="url">

        <value>proxool.spring_user</value>

     </property>

   </bean>

   web.xml中做如下配置

<!-- 制定proxool.xml放置的位置 -->

     <param-value>WEB-INF/proxool.xml</param-value>

   </context-param>

   <listener>

proxool.xml連接池配置文件放入到工程里WEB-INF目錄下,其中proxool.xml的內(nèi)容如下:

<?xml version="1.0" encoding="utf-8"?>   

 <!-- the proxool configuration can be embedded within your own application's.    

 Anything outside the "proxool" tag is ignored. -->   

 <something-else-entirely>   

     <proxool>   

         <alias>spring_user</alias>

      <driver-url>jdbc:mysql://192.168.1.150:3306/chiyuweb</driver-url>   

         <driver-class>com.mysql.jdbc.Driver</driver-class>   

         <driver-properties>   

             <property name="user" value="root" />   

             <property name="password" value="123456" />   

             <property name="useUnicode" value="true" />   

             <property name="characterEncoding" value="GBK" />   

         </driver-properties>   

        <minimum-connection-count>5</minimum-connection-count>            <maximum-connection-count>50</maximum-connection-count>           <maximum-active-time>60000</maximum-active-time>   

         <house-keeping-test-sql>select 1</house-keeping-test-sql>   

         <prototype-count>5</prototype-count>   

         <house-keeping-sleep-time>60000</house-keeping-sleep-time>   

     </proxool>   

 </something-else-entirely>

 注:prxool這個文件里<alias>spring_user</alias> 表示連接的別名,一個連接池可以配置多個連接

2 Hibernate 多條件分頁查詢

   Hibernate的多條件查詢的方法有很多種,比較常用的有兩種,一種的創(chuàng)建Query對象,一種是創(chuàng)建Criteria對象。

    Query對象查詢:Hibernate上下文對象query= session.createQuery(HQL); query.setParameters(Object[] params,Type[] types)返回一個根據(jù)參數(shù)查詢的List集合。分頁方法query.setFirstResult(START),START參數(shù)表示從查詢到的結(jié)果集里第幾條記錄開始取query.setMaxResults(ROWS),ROWS表示分頁信息中每頁查詢的記錄條數(shù)。根據(jù)如上方法即可以實現(xiàn)hibernate多條件分頁查詢。其中query.setParameters方法的兩個參數(shù),params,types。他們是一一對應(yīng),成對出現(xiàn)的,所以最后用順序表來保存他們的值,即兩個用ArrayList來成對存儲兩個參數(shù),然后將他們轉(zhuǎn)化成數(shù)組。Type類型是org.hibernate中的Type類。如果參數(shù)是String類型,則參數(shù)需要設(shè)置成Hibernate.STRING,如他類型依次類推。時間類型需要注意如果比較精確到天,類型可設(shè)置成Hibernate.DATE,如果時間要精確到秒,則時間類型需要設(shè)置成Hibernate.TIMESTAMPS.

           Criteria對象查詢,調(diào)用session.createCriteria(Type type).add() type是反射包里面的Type (若查User類 ,則傳入User.class),add()方法能夠傳入字段的名稱 addOrder方法能夠傳入排序規(guī)則,如此實現(xiàn)多條件查詢。分頁方法同query

3 Hibernate關(guān)聯(lián)關(guān)系

Hibernate通常用的關(guān)聯(lián)關(guān)系有三種:一對一,一對多和多對多。

一對一的方式有兩種:一種是聯(lián)合主鍵;一種是通過其他列來關(guān)聯(lián),即多對一的特殊形式,將多對一unique屬性設(shè)置為true。配置方法網(wǎng)上都有這里就不啰嗦。

     多對多關(guān)系并不提倡用many-to-many方式來配,通常用兩個一對多的關(guān)系來實現(xiàn)。

      一對多關(guān)系,這個關(guān)系的配的時候要特別注意,在多的一方<many-to-one/> 這邊的lazy屬性一般不要設(shè)置為false。這樣配會大大的降低程序的性能。還有就是關(guān)聯(lián)的列最好不要設(shè)置成外鍵關(guān)系,以為這樣做加了外鍵會使數(shù)據(jù)庫不易維護。關(guān)聯(lián)列單獨設(shè)置,在實體配置文件中這個列的約束這樣設(shè)置 insert=”false”  update=”false” 即可。

對于一對多自連接關(guān)系舉一個實例來說明:

比如一個Person類里有老師和學(xué)生的關(guān)系

Person.hbm.xml配置如下

<property name=”teacher_id” type=”java.lang.Integer” insert=”false”  update=”false”  />

<set name="students" cascade="save-update" inverse="true" lazy="true">

     <key column="teacher_id" />

        <one-to-many class="Person" />

     </set>

 

   <many-to-one name="student" column="teacher_id"

        class="Person" cascade="save-update" />