Hibernate的起步步骤(简单)

squirrel_1976 2003-10-27 01:50:01
Hibernate的一些使用介绍
一、Hibernate是什么?
Hibernate是一个优秀的开发源代码的Java对象持久层轻量级封装框架,它既可以用来在Java应用程序中取代大部分JDBC代码,也可以整合到J2EE系统中作为持久层框架。
二、下载
到网址:
http://unc.dl.sourceforge.net/sourceforge/hibernate/hibernate-2.0.3.zip
下载hibernate2.0.3版本,这是目前的一个最新稳定版本。
三、配置classpath
一般情况下,把hibernate2.jar以及HIBERNATE_HOME\lib\目录下的23个jar加入到项目的类路径。其中有一些jar是可选的,如ant.jar、jaas.jar、jcs.jar、junit.jar等。

然后加入一些项目需要的包。如下面使用Oracle数据库,相应在classpath加入classes12.jar。
四、配置hibernate.properties
Hibernate的src目录下有一个hibernate.properties模板文件,这是Hibernate对所使用数据库的根本配置文件。现在把它copy到项目下的classes\目录下面,并做一些修改:

1、 找到“## Oracle”行,取消下面5行的注释,并根据数据库的实际情况,加入必要的信息,例如这里使用本机的oracle数据库(SID=study,user=hibernate,pwd=hibernate),则修改结果如下:
hibernate.dialect net.sf.hibernate.dialect.OracleDialecthibernate.connection.driver_class oracle.jdbc.driver.OracleDriverhibernate.connection.username hibernatehibernate.connection.password hibernatehibernate.connection.url jdbc:oracle:thin:@localhost:1521:STUDY

住:如果是在APP Server环境下使用连接池,则上面的参数修改如下:
hibernate.dialect net.sf.hibernate.dialect.OracleDialecthibernate.connection.datasource oraclePool hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider

2、fetch_size和batch_size:
hibernate.jdbc.fetch_size 50 hibernate.jdbc.batch_size 25

Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会1次性把1万条取出来的,而只会取出Fetch Size条数,当纪录集遍历完了这些记录以后,再去数据库取Fetch Size条数据。因此大大节省了无谓的内存消耗。当然Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。这有点像平时我们写程序写硬盘文件一样,设立一个Buffer,每次写入Buffer,等Buffer满了以后,一次写入硬盘,道理相同。

Oracle数据库的JDBC驱动默认的Fetch Size=10,是一个非常保守的设定,根据测试,当Fetch Size=50的时候,性能会提升1倍之多,当Fetch Size=100,性能还能继续提升20%,Fetch Size继续增大,性能提升的就不显著了。因此建议使用Oracle的一定要将Fetch Size设到50。

3、 show sql开关项:
hibernate.show_sql true

让Hibernate打印sql语句。开发时设为true,有利于调试。
五、建立POJO对象
Plain Old Java Object (POJO, sometimes called Plain Ordinary Java Object)通常是符合JavaBean规范的。在这个Demo中,让我们的POJO对象Cat.java和数据库中的一张表cat一致,下面列出Cat.java的源代码:
代码Cat.java:
/** * POJO */public class Cat { private String id; private String name; private char sex; private float weight; public Cat() { } public String getId() { return id; } public String getName() { return name; } public char getSex() { return sex; } public float getWeight() { return weight; } public void setId(String string) { id = string; } public void setName(String string) { name = string; } public void setSex(char c) { sex = c; } public void setWeight(float f) { weight = f; }}
六、Mapping file
要在Cat.java和数据表间建立映射关系,需借助于mapping文件cat.hbm.xml。
此类文件包含了O/R Mapping中系统需要了解的元数据,包括:持久对象的类的声明、类的属性、待映射的数据表名称、表的字段等。
代码cat.hbm.xml:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"><hibernate-mapping> <class name="Cat" table="CAT"> <!-- A 32 hex character is our surrogate key. It's automatically generated by Hibernate with the UUID pattern. --> <id name="id" type="string" unsaved-value="null" > <column name="CAT_ID" sql-type="char(32)" not-null="true"/> <generator class="uuid.hex"/> </id> <!-- A cat has to have a name, but it shouldn' be too long. --> <property name="name"> <column name="NAME" sql-type="varchar(16)" not-null="true"/> </property> <property name="sex"/> <property name="weight"/> </class></hibernate-mapping>

把cat.hbm.xml放到项目的classes\目录下。
七、开始测试
简略起见,这里直接贴出TestCat的代码,并对它的方法做简单注释,编译好后,就可以运行了。
代码TestCat.java:
import java.util.Iterator;import net.sf.hibernate.*;import net.sf.hibernate.cfg.*;import net.sf.hibernate.tool.hbm2ddl.SchemaExport;/** * This example demonstrates how to auto-create table, and operate on the table using hibernate. */public class TestCat { private SessionFactory sessionFactory; private Session session; private Transaction trans; private Configuration conf; private SchemaExport dbExport; public TestCat() throws HibernateException { // Load Configuration and build SessionFactory conf = new Configuration().addClass(Cat.class); dbExport = new SchemaExport(conf); dbExport.create(true, true); sessionFactory = conf.buildSessionFactory(); } private void beginTransaction() throws HibernateException { if (sessionFactory == null) throw new IllegalStateException("Session Factory not ready!"); session = sessionFactory.openSession(); trans = session.beginTransaction(); } private void endTransaction(boolean commit) throws HibernateException { if (!session.isOpen()) throw new IllegalStateException("Session has been closed."); if (commit) { trans.commit(); } else { trans.rollback(); } session.close(); } /** * Insert data to table using hibernate * * @throws HibernateException */ public void creatCats() throws HibernateException { Cat princess = new Cat(); princess.setName("Princess"); princess.setSex('F'); princess.setWeight(7.4f); session.save(princess); Cat max = new Cat(); max.setName("Max"); max.setSex('M'); max.setWeight(8.1f); session.save(max); Cat sophie = new Cat(); sophie.setName("Sophie"); sophie.setSex('F'); sophie.setWeight(4.1f); session.save(sophie); } /** * Select from table and print data * * @throws HibernateException */ public void selectAllCats() throws HibernateException { String sql = "select cat from Cat as cat"; Query query = session.createQuery(sql); System.out.println("全表查询结果:"); for (Iterator iter = query.iterate(); iter.hasNext();) { Cat cat = (Cat)iter.next(); print(cat); } } /** * Select from table with condition * * @throws HibernateException */ public void selectFemaleCats() throws HibernateException { String sql = "select cat from Cat as cat where cat.sex = :sex"; Query query = session.createQuery(sql); query.setCharacter("sex", 'F'); System.out.println("雌性猫的查询结果:"); for (Iterator iter = query.iterate(); iter.hasNext();) { Cat cat = (Cat)iter.next(); print(cat); } } private void print(Cat cat) { System.out.println("ID --- " + cat.getId()); System.out.println("Name --- " + cat.getName()); System.out.println("Sex --- " + cat.getSex()); System.out.println("Weight --- " + cat.getWeight()); } public static void main(String[] args) throws HibernateException { TestCat test = new TestCat(); test.beginTransaction(); test.creatCats(); test.endTransaction(true); System.out.println("Insert over."); test.beginTransaction(); test.selectAllCats(); test.endTransaction(false); test.beginTransaction(); test.selectFemaleCats(); test.endTransaction(false); }}

这个sample会演示Hibernate完成自动建表、插入数据、查询表等功能。

做完这一步后,就结束了与hibernate的第一次接触。在以后的环节中,还需要更深入的了解one-to-many、many-to-mang映射的实现、复杂HQL写法、Transaction原理等内容,充分的发挥出hibernate易用高效的特点。







备注:
文中的例子来自于官方网站http://www.hibernate.org/的quickstart教程,这里对它做了一些修改,以使它与tomcat分离,能在客户端运行;另外还参考引用了hibernate中文论坛http://forum.hibernate.org.cn/站长Robin的某些讲解。上面两个网址都是学习hibernate的好地方。
...全文
26 点赞 收藏 12
写回复
12 条回复
ddadoris 2004年02月11日
gong1,请问你说的论坛地址
回复 点赞
gong1 2004年02月11日
可到hibernate中文论坛。look,look
^_^
回复 点赞
ybcheng 2004年02月11日
这个问题是学习Java开始时就要学会解决的,嘿嘿
回复 点赞
lovelanzhi716 2004年02月10日
up...
还有没有更好的资料
回复 点赞
zxp_net 2003年12月15日
楼主既然发了这个帖子,总不能有头无尾吧,麻烦你帮我看看这个问题好吗?我倒贴100点,可不可以啊!
回复 点赞
binny 2003年12月12日
8懂,up一下
回复 点赞
sallina 2003年12月12日
搂住辛苦了,支持一下!
回复 点赞
zxp_net 2003年12月12日
我的2个class都是放在同一个package中,怎么会classnotfound呢,????问题在哪儿呢???
回复 点赞
xmvigour 2003年12月12日
现在是2。1 了
楼上的 看看你的classpath
学会看问题出在哪?
java.lang.ClassNotFoundException: Cat

回复 点赞
zxp_net 2003年12月12日
试过后,出现下面的异常,不知道什么原因,请大侠看看,万分感激:
INFO: Mapping resource: com/freeborders/app/Cat.hbm.xml

Dec 12, 2003 5:28:06 PM net.sf.hibernate.cfg.Configuration add

SEVERE: Could not compile the mapping document

java.lang.ClassNotFoundException: Cat

at java.net.URLClassLoader$1.run(URLClassLoader.java:198)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:186)

at java.lang.ClassLoader.loadClass(ClassLoader.java:299)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)

at java.lang.ClassLoader.loadClass(ClassLoader.java:255)

at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)

at java.lang.Class.forName0(Native Method)

at java.lang.Class.forName(Class.java:140)

at net.sf.hibernate.util.ReflectHelper.classForName(ReflectHelper.java:268)

at net.sf.hibernate.cfg.Binder.bindClass(Binder.java:73)

at net.sf.hibernate.cfg.Binder.bindRootClass(Binder.java:165)

at net.sf.hibernate.cfg.Binder.bindRoot(Binder.java:1095)

at net.sf.hibernate.cfg.Configuration.add(Configuration.java:230)

at net.sf.hibernate.cfg.Configuration.addInputStream(Configuration.java:252)

at net.sf.hibernate.cfg.Configuration.addClass(Configuration.java:286)

at com.freeborders.app.TestCat.<init>(TestCat.java:26)

at com.freeborders.app.TestCat.main(TestCat.java:127)

rethrown as net.sf.hibernate.MappingException: persistent class not found: Cat

at net.sf.hibernate.cfg.Binder.bindClass(Binder.java:76)

at net.sf.hibernate.cfg.Binder.bindRootClass(Binder.java:165)

at net.sf.hibernate.cfg.Binder.bindRoot(Binder.java:1095)

at net.sf.hibernate.cfg.Configuration.add(Configuration.java:230)

at net.sf.hibernate.cfg.Configuration.addInputStream(Configuration.java:252)

at net.sf.hibernate.cfg.Configuration.addClass(Configuration.java:286)

at com.freeborders.app.TestCat.<init>(TestCat.java:26)

at com.freeborders.app.TestCat.main(TestCat.java:127)

Caused by: java.lang.ClassNotFoundException: Cat
回复 点赞
zhxx 2003年10月30日
Hibernate的文章越多越好
回复 点赞
ji66 2003年10月30日
感谢
回复 点赞
发动态
发帖子
Java EE
创建于2007-09-28

3.7w+

社区成员

22.5w+

社区内容

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区公告
暂无公告