Hibernate使用总结

原创 2006年05月31日 17:41:00

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

在ECshop后台中添加自己的任务计划

在ECshop后台中添加自己的任务计划  所有的任务计划都放在/includes/modules/cron这个目录中,每一个文件的名称就是一个计划任务的code,每个任务计划对应的变量中文说明都在/l...

ECSHOP 计划任务总结

1.EC本身的计划任务是通过前台页面触发而执行的,通过后台的相关设置来实现2.EC后台开启   后台->商店设置->基本设置->是否开启命令行调用计划任务->是   这里注意的是要选择 否   在in...

关于ecshop数据库表和字段及后台模板说明

原文地址:关于ecshop数据库表和字段的说明作者:DevelopmentCorpu 关于ecshop数据库表和字段的说明,ecshop二次开发必备资料; ecs_account_log 用户帐号...

10款PHP开源网店系统

10款PHP开源网店系统一、osCommerce osCommerce 是一套基于GNU GPL授权的开源在线购物电子商务解决方案。该系统具有易于操作的可视化安装界面、完善的前台商品展示和户在线...

EcShop常用 促销活动表结构

促销活动Sql代码 --   -- Table structure for table `ecs_favourable_activity`   --     C...

ECSHOP 常量定义文件

常量 文件路径为lincludes/inc_constant.php<?php /** * ECSHOP 常量 * ===================================...

Hibernate注解方法使用总结

1.类级别注解 @Entity     映射实体类 @Table    映射数句库表   @Entity(name="tableName") - 必须,...

SSH中Hibernate的使用总结

SSH中Hibernate的使用总结       SSH项目中,引入了hibernate3.jar包,用于对数据库的操作。Hibernate是对数据库操作的封装工具包。通过对Hibernate的使用...

使用Hibernate时的一些错误总结

最近在学习用Hibernate,老师讲的好快,更多的只有自己看,自己弄,中间遇到了不少困难,这里主要总结一下练习中出现的一些报错及解决方法。  #CSDN@CSU-Max 1、在使用HQL进行数据查...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)