关于Struts2 + spring + hibernate进Q群: 130529143交流。
有偿技术支持Q群:398162181
注意:数据库基本配置信息(如数据库方言)参考:
hibernate-release-5.0.1.Final\project\etc\hibernate.properties ;
1.加入相应的 *.jar包:
1.1 官方下载:hibernate-release-5.0.1.Final.zip,解压后得到:hibernate-release-5.0.1.Final 文件夹。
hibernate-release-5.0.1.Final\lib\required\ 路径下所有jar包;
1.2 不同数据库连接所需的jdbc *.jar包:
mysql: mysql-connector-java-5.1.25-bin.jar ;
oracle: ojdbc14.jar ;
sqlserver:sqljdbc4.jar;
1.3 加入到lib下,并add to build path ;
2.配置hibernate.cfg.xml文件:
2.1 在类路径下新建 hibernate.cfg.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 配置连接数据库的基本信息 -->
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate5</property>
<!-- 配置hibernate的基本信息 -->
<!-- hibernate所使用的数据库方言 -->
<property name="dialog">org.hibernate.dialect.MySQLInnoDBDialect</property>
<!-- 执行操作时是否在操作台打印SQL -->
<property name="show_sql">true</property>
<!-- 是否对SQL进行格式化 -->
<property name="format_sql">true</property>
<!-- 指定自动生成数据表的策略 create:每次运行都删除上一次的表,重新生成表,即使第二次没有任何改变; create-drop:SessionFactory一关闭,表就自动删除;
update:若.hbm.xml文件和数据库中对应的数据表的表结构不同,Hibernate将更新数据表结构,但不会删除已有的行与列;这个属性最常用
validate:会与数据库中的表进行比较,若.hbm.xml文件中的列在数据表中不存在,则抛出异常。 -->
<!-- 设置Hibernate自动生成表结构 -->
<property name="hbm2ddl.auto">update</property>
<!-- 设置Hibernate的事务隔离级别 -->
<property name="connection.isolation">2</property>
<!-- 删除对象后,使其OID置为null -->
<property name="use_identifier_rollback">true</property>
<!-- 配置c3p0数据源
官方下载:hibernate-release-5.0.1.Final.zip,解压后得到:hibernate-release-5.0.1.Final 文件夹。
hibernate-release-5.0.1.Final\lib\optional\c3p0路径下所有jar包;
加入配置:hibernate.c3p0.max_size:数据库连接池的最大连接数
hibernate.c3p0.min_size:数据库连接持的最小连接数
hibernate.c3p0.aquire_increment:数据库连接池的连接耗尽时,同一时刻获取多少数据库连接
hibernate.c3p0.timeout:数据库连接池中连接对象在多长时间内没有连接过,就应该销毁
hibernate.c3p0.idle_test_period:表示连接池检测线程多长时间检测一次池内的所有连接对象是否超时。连接池本身不会把自己
从连接池中移除,而是专门有一个线程按照一定的时间间隔来做这件事。
这个线程通过将连接对象最后一次使用时间与当前时间的时间差来和timeout作对比,从而决定是否销毁这个连接对象。
hibernate.c3p0.max_statements:缓存Statement对象的数量
-->
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="c3p0.acquire_increment">2</property>
<property name="c3p0.idle_test_period">2000</property>
<property name="c3p0.timeout">50000</property>
<property name="c3p0.max_statements">10</property>
<!-- 下面这两个属性对mysql数据库无效, 但对oracle数据库有效 -->
<!-- 设定JDBC的statement读取数据的时候每次从数据库中取出的记录条数 -->
<property name="hibernate.jdbc.fetch_size">100</property>
<!-- 设定对数据库进行批量删除、批量更新和批量插入的时候的批次大小 -->
<property name="hibernate.jdbc.batch_size">30</property>
<!-- 需要关联的 hibernate 映射文件 .hbm.xml -->
<mapping resource="com/lixuan/hibernate/entities/n2n/Category.hbm.xml" />
<mapping resource="com/lixuan/hibernate/entities/n2n/Item.hbm.xml" />
</session-factory>
</hibernate-configuration>
3.生成实体类相应的 *.hbm.xml文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.lixuan.hibernate.entities.n2n">
<class name="Category" table="CATEGORYS">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<!-- table: 指定中间表 -->
<set name="items" table="CATEGORYS_ITEM">
<key>
<column name="C_ID" />
</key>
<!-- 使用many-to-many指定多对多的关联关系
column:Set集合中的持久化类在中间表的外键列的名称
-->
<many-to-many class="Item" column="I_ID"></many-to-many>
</set>
</class>
</hibernate-mapping>
4.将 *.hbm.xml文件引入到hibernate.cfg.xml文件中:
将3.中的 *.hbm.xml 加入 2.种的hibernate.cfg.xml。
5.配置c3p0数据源:
5.1 官方下载:hibernate-release-5.0.1.Final.zip,解压后得到:hibernate-release-5.0.1.Final 文件夹。
将hibernate-release-5.0.1.Final\lib\optional\c3p0路径下所有jar包添加到类路径下;
5.2 在hibernate.cfg.xml文件中配置c3p0数据源 如 2 所示:
ibernate.c3p0.max_size: 数据库连接池的最大连接数
hibernate.c3p0.min_size: 数据库连接池的最小连接数
hibernate.c3p0.acquire_increment: 当数据库连接池中的连接耗尽时, 同一时刻获取多少个数据库连接
hibernate.c3p0.timeout: 数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁
hibernate.c3p0.idle_test_period: 表示连接池检测线程多长时间检测一次池内的所有链接对象是否超时.
连接池本身不会把自己从连接池中移除,而是专门有一个线程按照一定的时间间隔来做这件事,
这个线程通过比较连接对象最后一次被使用时间和当前时间的时间差来和 timeout 做对比,进而决定是否销毁这个连接对象。
hibernate.c3p0.max_statements: 缓存 Statement 对象的数量
6.hibernate缓存:
6.1 一级缓存:在Session中;
hibernate-release-5.0.1.Final.zip,解压后得到:hibernate-release-5.0.1.Final 文件夹。
hibernate-release-5.0.1.Final\lib\optional\c3p0路径下所有jar包;
6.2 二级缓存:在SessionFactory中;
1). 加入二级缓存插件的 jar 包及配置文件:
I. 复制 hibernate-release-5.0.1.Final\lib\optional\ehcache*.jar 到当前 应用的类路径下.
II. 复制 hibernate-release-5.0.1.Final\project\etc\ehcachexml 到当前 WEB 应用的类路径下
2). 配置 hibernate.cfg.xml
I. 配置启用 hibernate 的二级缓存
<property name="cache.use_second_level_cache">true</property>
II. 配置hibernate二级缓存使用的产品
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
III. 配置对哪些类使用 hibernate 的二级缓存
<class-cache usage="read-write" class="com.atguigu.hibernate.entities.Employee"/>
实际上也可以在 .hbm.xml 文件中配置对哪些类使用二级缓存, 及二级缓存的策略是什么.
3). 集合级别的二级缓存的配置
I. 配置对集合使用二级缓存 :在hibernate.cfg.xml中配置:
<collection-cache usage="read-write" collection="com.atguigu.hibernate.entities.Department.emps"/>
也可以在 .hbm.xml 文件中进行配置
<set name="emps" table="GG_EMPLOYEE" inverse="true" lazy="true">
<cache usage="read-write"/>
<key><column name="DEPT_ID" /></key>
<one-to-many class="com.atguigu.hibernate.entities.Employee" />
</set>
II. 注意: 还需要配置集合中的元素对应的持久化类也使用二级缓存! 否则将会多出 n 条 SQL 语句.
4). ehcache 的 配置文件: ehcache.xml
5). 查询缓存: 默认情况下, 设置的缓存对 HQL 及 QBC 查询时无效的, 但可以通过以下方式使其是有效的
I. 在 hibernate 配置文件中声明开启查询缓存
<property name="cache.use_query_cache">true</property>
II. 调用 Query 或 Criteria 的 setCacheable(true) 方法
III. 查询缓存依赖于二级缓存
关于Struts2 + spring + hibernate进Q群: 130529143交流。
有偿技术支持Q群:398162181