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

Hibernate注解使用方法总结

1.类级别注解 @Entity     映射实体类 @Table    映射数句库表   @Entity(name="tableName") - 必须,注解将一个类声明为一个实体bean。 属性: ...
  • ARYBD
  • ARYBD
  • 2016年07月29日 15:00
  • 9748

Hibernate学习及使用总结:121&12n&n2n

Hibernate 一对一 一对多 多对多的配置方法

Hibernate注解方法使用总结

1.类级别注解 @Entity     映射实体类 @Table    映射数句库表   @Entity(name="tableName") - 必须,注解将一个类声明为一个实...
  • AinUser
  • AinUser
  • 2017年04月21日 14:31
  • 227

hibernate 一级和二级缓存使用总结

hibernate的缓存分为一级缓存和二级缓存,一级二级和我们常说的cpu的一级二级是不一样的。这里的一级说的是session的缓存,是hibernate内置的,不能卸载。二级说的是SessionFa...

MySql使用Hibernate的异常的总结

1.把mysql的关键字interval ,time当做了字段描述而引起的。 2.和数据库连接经常断开,Hibernate: Communication link failure: java.i...

Hibernate 注解使用总结

1.@Entity注解用于持久化POJO类 2.@Table注解指定数据库的表,目录和schema @UniqueConstraints 可以定义表级约束 @Entity @Table(name = ...

hibernate的lazy策略使用总结

lazy策略可以使用在:   * 标签上,可以取值:true/false   * 标签上,可以取值:true/false需要类增强工具   * 标签上,可以取值:true/false/extra   ...
  • FG2006
  • FG2006
  • 2011年05月23日 11:19
  • 735

01.关于使用Hibernate技术实现分页显示的思考总结

关于使用Hibernate技术实现分页显示的思考总结作者:吕鹏把数据库的数据取出来,放在网页上简单,但实现分页一直是让我头疼的问题,我从去年和团队做项目的时候就不会,今年又遇到这个问题了,我还是不会,...

【Hibernate】hql使用总结(上)

hibernate是一个全自动的 ORM映射,拥有特色的hql语句,它可以自动生成sql语句自动执行。和sql语句有很多相似的地方,之前做项目的时候用过,但是理解的不够全面,体会最深刻的就是把表名写作...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Hibernate使用总结
举报原因:
原因补充:

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