关闭

Hibernate使用总结

标签: hibernate数据库beansessionlist脚本
4552人阅读 评论(0) 收藏 举报
分类:

Java中Hibernate的应用,有三点需要注意:
1.hibernate.properties可以直接使用Hibernate自带的,里面含有连接各种类型数据库所需要的配置模板
2.Hibernate和数据库表的映射关系可以通过两种方式实现:
  1>需要手工为与数据库表形成映射关系的bean建立配置文件,命名为bean_name.hbm.xml
  2>通过在这些bean中写入建立数据库映射所需的hibernate注释,由xdoclet为这些bean直接生成一份配置文件
3.关于hibernate中经常涉及到的延迟加载机制(Lazy Loading)
  当通过hibernate把查询记录存入到一个List中,如果在关闭session之前取出List中的数据,则一切正常;如果在关闭session之后取出List中的数据,会报出如下错误信息:LazyInitializationException: could not initialize proxy - the owning Session was closed
  试过了Hibernate.initialize(list)方法(可以通过强制加载关联对象实现延迟加载),直接强制加载list,但仍有问题。目前的解决方法是尽量避免关闭session之后从存储对象中取出数据。

Hibernate支持4种类型的连接池(所需要的jar包在下载的hibernate.zip压缩包中都有),具体如下:
1>hibernate自带的:
  #hibernate.connection.pool_size     连接池容量上限数目(只有这一项配置)
2>c3p0
  #hibernate.c3p0.max_size 2    最大连接数
  #hibernate.c3p0.min_size 2
  #hibernate.c3p0.timeout 5000     数据库连接对象最大持有时间(以秒为单位)
  #hibernate.c3p0.max_statements 100    最大可缓存数据库语句对象,设为0则不缓存
  #hibernate.c3p0.idle_test_period 3000
  #hibernate.c3p0.acquire_increment 2
  #hibernate.c3p0.validate false
3>proxool
  #hibernate.proxool.pool_alias pool1
##===Only need one of the following===
  #hibernate.proxool.existing_pool true
  #hibernate.proxool.xml proxool.xml
  #hibernate.proxool.properties proxool.properties
4>DBCP
  #hibernate.dbcp.maxActive    最大有效的数据库连接数
  #hibernate.dbcp.maxIdle     最大空闲的数据库连接数
  #hibernate.dbcp.maxWait     数据库连接最大可空闲时间(以毫秒为单位,设为-1则关闭)
  #hibernate.dbcp.whenExhaustedAction     当连接池的连接耗尽时的对策,为0则不予响应,为1则阻塞直到有可用的连接,为2则新增加一个连接
  #hibernate.dbcp.testOnBorrow    当从连接池获得连接时是否检验该连接有效
  #hibernate.dbcp.testOnReturn    当连接返回连接池中时,是否检验该连接有效

下面对使用Hibernate时的各部分进行详细说明(配置文件通过xdoclet生成):

COMMENT

首先,和数据库表建立映射关系的bean

package com.neu.bean;

//dynamic-update设置生成update sql时只包含当前发生变化的字段
//dynamic-inser设置生成insert sql时只包含当前非空字段

/**
 * @hibernate.class
 *  table="user_info"
 *  dynamic-insert="true"
 *  dynamic-update="true"
 *
 */

public class UserInfo {
 private int id;
 private String name;
 public UserInfo(){
  this.id=0;
  this.name="";
 }

//hibernate.id用来描述POJO(Plain Ordinary Java Object)中关键字段与数据库表主键之间的映射关系
//generator-class设置主键产生方式
//column设置主键字段名

 /**
  * @hibernate.id
  *  generator-class="assigned"
  *  type="int"
  *  column="id"
  */
 
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }

//hibernate.property用来描述POJO中属性与数据库表字段之间的映射关系
//column设置数据库表字段名

 /**
  * @hibernate.property
  *  column="name"
  */
 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }
}

接下来开始进行对数据库操作:

//使用bean_name.hbm.xml配置文件的初始化代码
Configuration config=new Configuration().addClass(UserInfo.class);
SessionFactory sessions=config.buildSessionFactory();
new SchemaExport(config).create(true,true);//创建该数据库表(两个属性为:是否在控制台打印出脚本,是否导出脚本)
Session session=sessions.openSession();//Session是持久层操作的基础,相当于JDBC中的Connection
//插入记录的操作
UserInfo user=new UserInfo();
user.setId(1);
user.setName("Nokia");
session.save(user);
session.flush();
//查询、更新记录的操作
Query q = session.createQuery("from UserInfo where name='Nokia'");//UserInfo为bean的名字,非数据库表名
List list=(List)q.list();
user = (UserInfo) q.list().get(0);
user.setName("Neu");
session.update(user);
session.flush();//强制将user实例立即同步到数据库中,另session关闭时会自动执行flush方法
session.close();

然后,再看看build.xml的详细配置

<!--通过以下代码可以根据与数据库表建立映射关系的bean生成.hbm.xml配置文件-->
<target name="init" depends="todo">
<javac srcdir="${src}" destdir="${class}" classpathref="path.lib.hibernate" debug="on"/>
<taskdef name="hibernatedoclet" classname="xdoclet.modules.hibernate.HibernateDocletTask" classpathref="path.lib.xdoclet"/>
<hibernatedoclet destdir="${conf}">
<fileset dir="${src}">
<include name="**/*.java"/>
</fileset>
<hibernate version="3.0" />
</hibernatedoclet>
</target>

<!--通过以下代码可以根据生成的.hbm.xml文件创建数据库表(如果之前该表已经存在,则首先会drop掉该表),并生成对应的sql脚本文件-->
<target name="createHiber" depends="init">
    <!--SchemaExport为schema生成器,可从已编译的Java类或是带有XDoclet标记的Java源代码生成映射文件-->
    <taskdef name="schemaexport" classname="org.hibernate.tool.hbm2ddl.SchemaExportTask" classpathref="path.lib.all"/>
        <!--properties从指定文件读入数据库属性
            quiet是否把sql脚本输出
            text是否执行在数据库中运行的步骤
            drop是否进行drop tables的操作
            delimiter为脚本设置行结束符
            output把输出的脚本保存到指定文件-->
       <schemaexport properties="${conf}/hibernate.properties" quiet="no" text="no" drop="no" delimiter=";" output="${conf}/schema-export.sql">
            <!--需要把生成的hbm.xml配置文件与相应的类文件放在一起-->
           <fileset dir="${class}">
                 <include name="**/*.hbm.xml"/>
            </fileset>
        </schemaexport>
</target>

:1.运行该程序之前需要先build一次,以便生成运行程序所需的hbm.xml配置文件
    2.需要把hibernate.properties文件往classes根目录下拷贝一份,这样的话运行程序的时候才能找到这个文件

文中注释参考:http://www.stallian.com/docs/java/hibernate/2.1/overview-tree.html

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:54831次
    • 积分:710
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:2篇
    • 译文:0篇
    • 评论:9条
    最新评论