1 Hibernate 连接池
hibernate自带一个连接池,但是这个连接池的性能不好,BUG也比较多,所以hibernate借助第三方的连接池来配置。通常用的比较多的是prxool。目前在j2ee中最通用的框架ssh中,hibernate的配置如下:
在spring 的applicationContext.xm.配置文件里配置数据源连接信息:
<!-- 配置数据源 -->
<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的内容如下:
<?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的多条件查询的方法有很多种,比较常用的有两种,一种的创建Query对象,一种是创建Criteria对象。
Query对象查询:Hibernate上下文对象query= session.createQuery(HQL); query.setParameters(Object[]
params,Type[] types)返回一个根据参数查询的List集合。分页方法query.setFirstResult(START),START参数表示从查询到的结果集里第几条记录开始取query.setMaxResults(ROWS),ROWS表示分页信息中每页查询的记录条数。根据如上方法即可以实现hibernate多条件分页查询。其中query.setParameters方法的两个参数,params,types。他们是一一对应,成对出现的,所以最后用顺序表来保存他们的值,即两个用ArrayList来成对存储两个参数,然后将他们转化成数组。Type类型是org.hibernate中的Type类。如果参数是String类型,则参数需要设置成Hibernate.STRING,如他类型依次类推。时间类型需要注意如果比较精确到天,类型可设置成Hibernate.DATE,如果时间要精确到秒,则时间类型需要设置成Hibernate.TIMESTAMPS.
Criteria对象查询,调用session.createCriteria(Type type).add() type是反射包里面的Type ,(若查User类
,则传入User.class),add()方法能够传入字段的名称
addOrder方法能够传入排序规则,如此实现多条件查询。分页方法同query。
3 Hibernate关联关系
Hibernate通常用的关联关系有三种:一对一,一对多和多对多。
一对一的方式有两种:一种是联合主键;一种是通过其他列来关联,即多对一的特殊形式,将多对一unique属性设置为true。配置方法网上都有这里就不啰嗦。
多对多关系并不提倡用many-to-many方式来配,通常用两个一对多的关系来实现。
一对多关系,这个关系的配的时候要特别注意,在多的一方<many-to-one/> 这边的lazy属性一般不要设置为false。这样配会大大的降低程序的性能。还有就是关联的列最好不要设置成外键关系,以为这样做加了外键会使数据库不易维护。关联列单独设置,在实体配置文件中这个列的约束这样设置 insert=”false” update=”false” 即可。
对于一对多自连接关系举一个实例来说明:
比如一个Person类里有老师和学生的关系
则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"
/>