您的位置:首页 > 其它

Hibernate使用总结

2006-05-31 17:41 447 查看
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生成):



首先,和数据库表建立映射关系的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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: