谨以此文献给还没使用但准备使用hibernate的朋友,万事开头难,我就以自己的经历来帮助大家迈出这最难的一步吧!
跟很多朋友一样,我初学hibernate时大费周折,看过众多的书也参与过几个跟hibernate有关的项目,但是从来没有自己去创建过一个hibernate的项目,因此我对hibernate的认识是非常肤浅的。终于有一天,我再也坐不住了,我必须创建自己的hibernate项目,我要加深对hibernate的认识,于是,我静下心来,开始了我的hibernate之旅。
一、建立第一个hibernate工程
准备工作:
1、首先到hibernate官方网(http://www.hibernate.org/)下载最新的发布版,目前是 3.2.2 GA,同时将hibernate-annotations-3.3.0.GA也下载下来,这个是用于创建基于JDK5.0元注解的hibernate项目所需要的包;
2、准备一个IDE,我个人比较喜欢eclipse,现在最新是3.3版,在eclipse官方网上有下:http://www.eclipse.org/,解压到任意目录即可;
3、下载hibernate tools,一个eclipse的插件,jboss tools的一部分。它具有:向导生成hibernate.cfg.xml文件,动态予览hql,java类映射ddl等功能;下载完后解压,然后采用link方式安装eclipse插件;
建立工程:
1、 启动eclipse,在工作台上打开Navigator透视图,然后“file”-“new”-“Java Project”,弹出如图窗口:
在“Project name”栏输入工程名称“hibernate tutorial”,然后按“finish”完成新建工程;
2、 在Navigator透视图中选中新建的工程根目录,右键-“new”-“Folder”来创建一个“lib”文件夹,用于存放工程依赖的jar文件,如图:
因为数据库我用的是mysql,所以这里用的是mysql的驱动包(lib中最下面那个文件);
3、 将必需的jar包加载到build path中:
选中工程跟目录,右键-“properties”,弹出属性窗口,如图:
按照红色标注部分进行操作,最后按两次“ok”完成build path的加载;
4、 创建域模型:
选中工程,右键-“new”-“class”,弹出新建类的对话框,如图:
设置好包名跟类名后按“finish”完成类的创建;之后eclipse会自动打开该类的.java文件,我们创建一些简单属性并生成其getter跟setter方法,这里我们用到了hibernate annotation来代替hbm.xml完成类的映射(注意:要使用annotation必须要求JDK为5.0或以上版本);
@Table
public class Message ... {
private Long id;
private String text;
private Message nextMessage;
@Id
@GeneratedValue
public Long getId() ...{
return id;
}
public String getText() ...{
return text;
}
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "NEXT_MESSAGE_ID")
public Message getNextMessage() ...{
return nextMessage;
}
// 省略setter方法
}
其中元注解的意义可以参考hibernate annotation文档,在其发行包的doc下就有;如果你想使用hbm.xml文件,那么也给你一个参考(Message.hbm.xml):
<! DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
< hibernate-mapping >
< class name =" com.enrising.hibenatetutorial.model.Message" >
< id name ="id" >
< generator class ="native" />
</ id >
< property name ="text" />
< many-to-one name ="nextMessage" cascade ="all" column ="NEXT_MESSAGE_ID" foreign-key ="FK_NEXT_MESSAGE" />
</ class >
</ hibernate-mapping >
5、 配置hibernate:
有两种方式:hibernate.properties跟hibernate.cfg.xml,官方推荐是前者,因为其比较灵活,但是在创建session工厂时需要用add方法将模型类加载到hibernate配置中,否则hibernate是找不到模型类的;而cfg.xml文件可以通过mapping标签将模型类映射到hibernate配置中,如果模型类比较多,则这种方式非常灵活,所以这里我们选用cfg.xml方式;cfg.xml文件配置相当简单,只需声明如何连数据库及映射模型类即可,如果觉得写xml麻烦,那么就使用hibernate tools来向导生成cfg.xml吧;选中工程下的src目录,右键-“new”-“other”-“hibernate”-“hibernate Configuration File”,按两次“next”按钮,来到配置界面,如图:
其中配置根据个人具体情况而定,留空的地方最好不要填写,以免出现不必要的错误;按“finish”完成hibernate配置;这时eclipse会自动打开hibernate.cfg.xml文件供你手动编辑;这里我们在</session-factory>之前加上如下配置:
< property name ="show_sql" > true </ property >
< property name ="format_sql" > true </ property >
<!-- auto schema export -->
<!-- 如果第一次启动hibernate并希望自动映射数据库表;则取消掉这段注释,否则请将其注释掉,免去不必要的开销
<property name="hibernate.hbm2ddl.auto">update</property>
-->
<!-- mapping class -->
< mapping class ="com.enrising.hibenatetutorial.model.Message" />
<!-- 如果是使用hbm.xml文件,则需要把这句该成:
<mapping resource="com/enrising/hibenatetutorial/model/Message.hbm.xml"/>
-->
如果还有其它模型类,依次加到后面即可,到此为止,hibernate的配置已经完成;
6、 创建启动hibernate跟监听session工厂的辅助类HibernateUtil.java:
* Startup Hibernate and provide access to the singleton SessionFactory
*/
public class HibernateUtil ... {
private static SessionFactory sessionFactory;
static ...{
try ...{
sessionFactory = new AnnotationConfiguration().configure()
.buildSessionFactory();
} catch (Throwable ex) ...{
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() ...{
// Alternatively, we could look up in JNDI here
return sessionFactory;
}
public static void shutdown() ...{
// Close caches and connection pools
getSessionFactory().close();
}
}
这个类是官方推荐的,只是因为我们要用到annotation,所以将原来的Configuration换成了AnnotationConfiguration;如果使用hbm.xml文件,则需要改成Configuration;
7、 创建一个测试类Test.java:
/** *//**
* @param args
*/
public static void main(String[] args) ...{
// 获得session
Session session = HibernateUtil.getSessionFactory().openSession();
// 创建一个模型的实例
Message message = new Message();
message.setText("hello world.");
message.setNextMessage((Message) session
.get(Message.class, new Long(1)));
// 调用session保存模型
session.save(message);
session.flush();
// 提交事务
session.beginTransaction().commit();
// 执行一些收尾工作
session.close();
HibernateUtil.shutdown();
}
}
8、 准备一个日志配置文件log4j.properties,用于监视hibernate如何启动及查看hibernate映射的sql语句;这个文件网上海的很,随便搜索一个即可,这里提供一个参考版本:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
### set log levels - for more verbose logging change 'info' to 'debug' ###
log4j.rootLogger=warn, stdout
log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug
### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug
### log just the SQL
log4j.logger.org.hibernate.SQL=debug
### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug
### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug
到此为止,我们的第一个hibernate工程已经建立起,接下来就测试我们的项目是否正确工作,运行Test.java文件,然后查看控制台,如果看到如下信息说明运行正常:
18:30:51,339 INFO SchemaUpdate:115 - Running hbm2ddl schema update
18:30:51,339 INFO SchemaUpdate:126 - fetching database metadata
18:30:51,349 INFO SchemaUpdate:138 - updating schema
18:30:51,689 INFO TableMetadata:40 - table found: hibernatedemo.message
18:30:51,699 INFO TableMetadata:41 - columns: [id, text, next_message_id]
18:30:51,699 INFO TableMetadata:43 - foreign keys: [fk 9c 2397e73cd 7f 3ea]
18:30:51,699 INFO TableMetadata:44 - indexes: [fk 9c 2397e73cd 7f 3ea, primary]
18:30:51,699 DEBUG SchemaUpdate:149 - alter table Message add index FK 9C 2397E 7C 2F 0584B (NEXT_MESSAGE_ID), add constraint FK 9C 2397E 7C 2F 0584B foreign key (NEXT_MESSAGE_ID) references Message (id)
18:30:52,380 INFO SchemaUpdate:160 - schema update complete
……
insert
into
Message
(NEXT_MESSAGE_ID, text)
values
(?, ?)
信息的上半部分是利用hibernate tools更新表结构;下半部分是hibernate执行保存操作时生成的sql语句。这时你可以打开你的数据库,查看数据是否已经保存成功吧~It’s here~
到此为止,整篇hibernate3入门文章已经结束,由于不太会写文章,所以尽量以图片跟代码来代替文字,还望大家见谅。加之本人水平有限,文中如有不足或者错误之处,还望大家不吝赐教,谢谢!最后祝大家暑假愉快,工作顺利!