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
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
相关文章推荐
- Hibernate注解方法使用总结
- hibernate使用总结
- hibernate+spring+mvc+Easyui框架模式下使用grid++report的总结
- hibernate使用总结(1)
- paip. 提升性能---hibernate的缓存使用 总结
- (转)【Hibernate总结系列】使用举例
- hibernate+spring+mvc+Easyui框架模式下使用grid++report的总结
- 在项目中使用Hibernate进行大数据量的性能测试,有一些总结(转贴)
- SpringMVC+hibernate+mysql环境搭建后测试例中使用的注解总结
- hibernate3.6.0使用总结
- 使用Hibernate、Struts的一些错误总结
- hibernate框架中inverse和cascade的使用总结
- 【Hibernate】hql使用总结(上)
- 使用Spring、Hibernate、Struts的一些错误总结(转)
- Hibernate使用总结
- Hibernate使用总结
- Hibernate学习及使用总结:121&12n&n2n
- Hibernate注解方法使用总结
- Hibernate HQL语句使用总结
- 【Hibernate总结系列】使用举例