Hibernate实验项目全程跟踪,手把手教你配置Hibernate

先说下实验项目环境:

hibernate项目jar包

hibernate-3.2.6.ga.jar

proxool-0.9.0RC3.jar

JDK1.6

Mysql数据库

 

项目介绍

主要是通过Hibernate所谓数据库的持久层,其中用连接池proxool来管理Hibernate的Session。

 

项目搭建

1.创建hibernateDemo项目

2.添加hibernate.cfg.xml

 

[html][/html] view plaincopy

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3.  “-//Hibernate/Hibernate Configuration DTD 3.0//EN”
  4.  “http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd”>
  5. <hibernate-configuration>
  6.     <session-factory>
  7.         <property name=”proxool.pool_alias”>proxoolPool</property>
  8.         <property name=”proxool.xml”>proxool.xml</property>
  9.         <property name=”connection.provider_class”>
  10.             org.hibernate.connection.ProxoolConnectionProvider
  11.         </property>
  12.         <property name=”dialect”>org.hibernate.dialect.MySQLDialect</property>
  13.         <property name=”connection.driver_class”>com.mysql.jdbc.Driver</property>
  14.         <property name=”show_sql”>true</property>
  15.         <property name=”format_sql”>false</property>
  16.     </session-factory>
  17. </hibernate-configuration>

3.添加proxool.xml

 

 

[html][/html] view plaincopy

  1. <?xml version=”1.0″ encoding=”utf-8″?>
  2. <something-else-entirely>
  3.     <proxool>
  4.         <!– 连接池名称 与 hibernate 设置的 proxool.pool_alias 参数要一致 –>
  5.         <alias>proxoolPool</alias>
  6.         <!– proxool只能管理由自己产生的连接 –>
  7.         <driver-url>
  8.            jdbc:mysql://127.0.0.1:3306/web3_plus?characterEncoding=UTF-8
  9.         </driver-url>
  10.         <driver-class>com.mysql.jdbc.Driver</driver-class>
  11.         <driver-properties>
  12.             <property name=”user” value=”root”/>
  13.             <property name=”password” value=”12344″/>
  14.         </driver-properties>
  15.         <!– proxool自动侦察各个连接状态的时间间隔(毫秒),
  16.              侦察到空闲的连接就马上回收,超时的销毁 –>
  17.         <house-keeping-sleep-time>120000</house-keeping-sleep-time>
  18.         <!– 指因未有空闲连接可以分配而在队列中等候的最大请求数,
  19.              超过这个请求数的用户连接就不会被接受 –>
  20.         <maximum-new-connections>20</maximum-new-connections>
  21.         <!– 最少保持的空闲连接数 –>
  22.         <prototype-count>5</prototype-count>
  23.         <!– 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候
  24.              ,最大的等待请求数由maximum-new-connections决定 –>
  25.         <maximum-connection-count>300</maximum-connection-count>
  26.         <!– 最小连接数 –>
  27.         <minimum-connection-count>10</minimum-connection-count>
  28.         <!– 同时最大连接数 –>
  29.         <simultaneous-build-throttle>30</simultaneous-build-throttle>
  30.         <!– 一次产生连接的数量 –>
  31.         <prototype-count>10</prototype-count>
  32.         <!– 连接最大时间活动 默认5分钟  –>
  33.         <maximum-active-time>36000000</maximum-active-time>
  34.         <!– 连接最大生命时间 默认4小时 –>
  35.         <maximum-connection-lifetime>43200000</maximum-connection-lifetime>
  36.     </proxool>
  37. </something-else-entirely>

以上就已经配置好了hibernate的基础环境。

 

4.创建Hibernate的SessionFactory,进行初始化Hibernate。

 

[java][/java] view plaincopy

  1. /*
  2.  * 文 件 名 : com.qisentech.data.hibernate.HibernateSessionFactory.java
  3.  * 创建日期 : 2013-08-25 0:24:58
  4.  * 创 建 者 : qsyang
  5.  */
  6. package com.qisentech.data.hibernate;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. import org.hibernate.Session;
  10. import org.hibernate.SessionFactory;
  11. import org.hibernate.cfg.Configuration;
  12. /**
  13.  *
  14.  * @author qsyang
  15.  */
  16. public class HibernateSessionFactory {
  17.     private static boolean inited = false;
  18.     private static SessionFactory factory = null;
  19.     private static Configuration cfg = null;
  20.     /**
  21.      * 初始化
  22.      */
  23.     public static synchronized void init() {
  24.         if (!inited) {
  25.             try {
  26.                 cfg = new Configuration();
  27.                 cfg.configure(“hibernate.cfg.xml”);
  28.                 factory = cfg.buildSessionFactory();
  29.                 inited = true;
  30.             } catch (Exception ex) {
  31.                 log.error(“初始化hibernate出错”, ex);
  32.                 throw new RuntimeException(ex);
  33.             }
  34.         } else {
  35.             throw new java.lang.IllegalStateException(
  36.                   “HibernateSessionFactory already initialized”);
  37.         }
  38.     }
  39.     public static Session openSession() {
  40.         return factory.openSession();
  41.     }
  42.     public static void destory() {
  43.         factory.close();
  44.     }
  45. }

好了,我们需要在系统运行之前,需要调用init方法来初始化HibernateSessionFactory。

 

当然也可以在测试的时候在创建,不过创建sessionFactory是很耗时的。

5.下面进行创建对象测试。

TFunction 与 TToolsBox(关系是一对多)

 

[html][/html] view plaincopy

  1. /*
  2.  * 文 件 名 : com.qisentech.webplus.entity.TFunction.java
  3.  * 创建日期 : 2013-8-23 15:40:01
  4.  * 创 建 者 : qsyang
  5.  */
  6. package com.qisentech.webplus.entity;
  7. import java.util.List;
  8. /**
  9.  * <p>Title: </p>
  10.  *
  11.  * <p>Description: </p>
  12.  *
  13.  * @author qsyang
  14.  * @version 1.0
  15.  */
  16. public class TFunction {
  17.     private int id;
  18.     private String name;
  19.     private String img;
  20.     private int sort;
  21.     private boolean isSystem;
  22.     private List<TToolsBox> toolsBoxList;
  23.     /**
  24.      * @return the id
  25.      */
  26.     public int getId() {
  27.         return id;
  28.     }
  29.     /**
  30.      * @param id the id to set
  31.      */
  32.     public void setId(int id) {
  33.         this.id = id;
  34.     }
  35.     /**
  36.      * @return the name
  37.      */
  38.     public String getName() {
  39.         return name;
  40.     }
  41.     /**
  42.      * @param name the name to set
  43.      */
  44.     public void setName(String name) {
  45.         this.name = name;
  46.     }
  47.     /**
  48.      * @return the img
  49.      */
  50.     public String getImg() {
  51.         return img;
  52.     }
  53.     /**
  54.      * @param img the img to set
  55.      */
  56.     public void setImg(String img) {
  57.         this.img = img;
  58.     }
  59.     /**
  60.      * @return the sort
  61.      */
  62.     public int getSort() {
  63.         return sort;
  64.     }
  65.     /**
  66.      * @param sort the sort to set
  67.      */
  68.     public void setSort(int sort) {
  69.         this.sort = sort;
  70.     }
  71.     /**
  72.      * @return the isSystem
  73.      */
  74.     public boolean isIsSystem() {
  75.         return isSystem;
  76.     }
  77.     /**
  78.      * @param isSystem the isSystem to set
  79.      */
  80.     public void setIsSystem(boolean isSystem) {
  81.         this.isSystem = isSystem;
  82.     }
  83.     /**
  84.      * @return the toolsBoxList
  85.      */
  86.     public List<TToolsBox> getToolsBoxList() {
  87.         return toolsBoxList;
  88.     }
  89.     /**
  90.      * @param toolsBoxList the toolsBoxList to set
  91.      */
  92.     public void setToolsBoxList(List<TToolsBox> toolsBoxList) {
  93.         this.toolsBoxList = toolsBoxList;
  94.     }
  95. }

 

[java][/java] view plaincopy

  1. /*
  2.  * 文 件 名 : com.qisentech.webplus.entity.TToolsBox.java
  3.  * 创建日期 : 2013-7-30 16:53:25
  4.  * 创 建 者 : qsyang
  5.  */
  6. package com.qisentech.webplus.entity;
  7. /**
  8.  * <p>Title: </p>
  9.  *
  10.  * <p>Description: </p>
  11.  *
  12.  * @author qsyang
  13.  * @version 1.0
  14.  */
  15. public class TToolsBox {
  16.     private int id;
  17.     private String name;
  18.     private String implClass;
  19.     private int functionId;
  20.     private String img;
  21.     private int sort;
  22.     private String url;
  23.     private boolean isValid;
  24.     private String target;
  25.     /**
  26.      * @return the id
  27.      */
  28.     public int getId() {
  29.         return id;
  30.     }
  31.     /**
  32.      * @param id the id to set
  33.      */
  34.     public void setId(int id) {
  35.         this.id = id;
  36.     }
  37.     /**
  38.      * @return the name
  39.      */
  40.     public String getName() {
  41.         return name;
  42.     }
  43.     /**
  44.      * @param name the name to set
  45.      */
  46.     public void setName(String name) {
  47.         this.name = name;
  48.     }
  49.     /**
  50.      * @return the implClass
  51.      */
  52.     public String getImplClass() {
  53.         return implClass;
  54.     }
  55.     /**
  56.      * @param implClass the implClass to set
  57.      */
  58.     public void setImplClass(String implClass) {
  59.         this.implClass = implClass;
  60.     }
  61.     /**
  62.      * @return the img
  63.      */
  64.     public String getImg() {
  65.         return img;
  66.     }
  67.     /**
  68.      * @param img the img to set
  69.      */
  70.     public void setImg(String img) {
  71.         this.img = img;
  72.     }
  73.     /**
  74.      * @return the sort
  75.      */
  76.     public int getSort() {
  77.         return sort;
  78.     }
  79.     /**
  80.      * @param sort the sort to set
  81.      */
  82.     public void setSort(int sort) {
  83.         this.sort = sort;
  84.     }
  85.     /**
  86.      * @return the url
  87.      */
  88.     public String getUrl() {
  89.         return url;
  90.     }
  91.     /**
  92.      * @param url the url to set
  93.      */
  94.     public void setUrl(String url) {
  95.         this.url = url;
  96.     }
  97.     /**
  98.      * @return the target
  99.      */
  100.     public String getTarget() {
  101.         return target;
  102.     }
  103.     /**
  104.      * @param target the target to set
  105.      */
  106.     public void setTarget(String target) {
  107.         this.target = target;
  108.     }
  109.     /**
  110.      * @return the isValid
  111.      */
  112.     public boolean isIsValid() {
  113.         return isValid;
  114.     }
  115.     /**
  116.      * @param isValid the isValid to set
  117.      */
  118.     public void setIsValid(boolean isValid) {
  119.         this.isValid = isValid;
  120.     }
  121.     /**
  122.      * @return the functionId
  123.      */
  124.     public int getFunctionId() {
  125.         return functionId;
  126.     }
  127.     /**
  128.      * @param functionId the functionId to set
  129.      */
  130.     public void setFunctionId(int functionId) {
  131.         this.functionId = functionId;
  132.     }
  133. }

好了,对象创建好了之后,需要创建对应的实体配置映射文件,主要是映射对象属性和数据库表字段的关系。

 

T.Function.hbm.xml

 

[html][/html] view plaincopy

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
  3.  “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
  4. <hibernate-mapping package=”com.qisentech.webplus.entity”>
  5.     <class name=”TFunction” table=”t_function”>
  6.         <id column=”Id” name=”id”>
  7.             <generator class=”native”/>
  8.         </id>
  9.         <property column=”Name” name=”name”/>
  10.         <property column=”Img” name=”img”/>
  11.         <property column=”Sort” name=”sort”/>
  12.         <property column=”IsSystem” name=”isSystem”/>
  13.         <bag cascade=”all” inverse=”false” lazy=”true” name=”toolsBoxList”
  14.              table=”t_toolsbox”>
  15.             <key column=”FunctionId”/>
  16.             <one-to-many class=”TToolsBox”/>
  17.         </bag>
  18.     </class>
  19. </hibernate-mapping>

T.TToolsBox.hbm.xml

 

 

[html][/html] view plaincopy

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <!DOCTYPE hibernate-mapping PUBLIC “-//Hibernate/Hibernate Mapping DTD 3.0//EN”
  3.  “http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd”>
  4. <hibernate-mapping package=”com.qisentech.webplus.entity”>
  5.     <class name=”TToolsBox” table=”t_toolsbox”>
  6.         <id column=”Id” name=”id”>
  7.             <generator class=”native”/>
  8.         </id>
  9.         <property column=”Name” name=”name”/>
  10.         <property column=”ImplClass” name=”implClass”/>
  11.         <property column=”Url” name=”url”/>
  12.         <property column=”Img” name=”img”/>
  13.         <property column=”Sort” name=”sort”/>
  14.         <property column=”IsValid” name=”isValid”/>
  15.         <property column=”Target” name=”target”/>
  16.         <property column=”FunctionId” name=”functionId”/>
  17.     </class>
  18. </hibernate-mapping>

好了,配置文件也写好了,需要将配置文件添加到hibernate.cfg.xml中映射进来。

 

 

[html][/html] view plaincopy

  1. <mapping resource=”com/qisentech/webplus/entity/T.Function.hbm.xml”/>
  2. <mapping resource=”com/qisentech/webplus/entity/T.TToolsBox.hbm.xml”/>

6.开始做获取第一个对象测试

 

数据库t_function表数据如下:

 

1 系统管理 box_title_xtgl.gif 10 1
2 基础功能 box_title_jlgl.gif 20 1
3 相关组件 box_title_xgzj.gif 30 1

 

数据库t_toolsbox表数据如下:

 

1 个人信息 NULL box_xgmm.gif 50 main.jsp 1 _self 1
2 人员管理 NULL box_idsgl.gif 50 index.jsp 1 _self 2
3 院系管理 NULL box_yxsz.gif 50 test.jsp 1 _blank 3

 

Session的get方法测试:

 

[java][/java] view plaincopy

  1. Session session = null;
  2. try {
  3.     session = HibernateSessionFactory.openSession();
  4.     Object obj = session.get(TFunction.class, id);
  5.     return obj == null ? null : (TFunction) obj;
  6. } catch (HibernateException ex) {
  7.     throw ex;
  8. }finally{
  9.     session.close();
  10. }

Session的load方法测试:

 

 

[java][/java] view plaincopy

  1. Session session = null;
  2. try {
  3.     session = HibernateSessionFactory.openSession();
  4.     Object obj = session.load(TFunction.class, id);
  5.     return (TFunction) obj;
  6. } catch (HibernateException ex) {
  7.     throw ex;
  8. }finally{
  9.     session.close();
  10. }

小插曲:Hibernate get和load区别?

 

1.从返回结果上对比:

load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常

get方法检索不到的话会返回null

2.从检索执行机制上对比:

get方法和find方法都是直接从数据库中检索 而load方法的执行则比较复杂首先查找session的persistent Context中是否有缓存,如果有则直接返回 如果没有则判断是否是lazy,如果不是直接访问数据库检索,查到记录返回,查不到抛出异常 如果是lazy则需要建立代理对象,对象的initialized属性为false,target属性为null 在访问获得的代理对象的属性时,检索数据库,如果找到记录则把该记录的对象复制到代理对象的target上,并将initialized=true,如果找不到就抛出异常。

简单总结

总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

关于Hibernate,还有很多需要探索,我会继续跟帖说明,大家一起学习吧!

标签