Hibernate3入门指南

谨以此文献给还没使用但准备使用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文件,动态予览hqljava类映射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文件,我们创建一些简单属性并生成其gettersetter方法,这里我们用到了hibernate annotation来代替hbm.xml完成类的映射(注意:要使用annotation必须要求JDK5.0或以上版本);

  

@Entity
@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):

 

<? xml version="1.0" ?>
<! 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.propertieshibernate.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>之前加上如下配置:

 

<!--  show sql  -->
        
< 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

 

public   class  Test  {
    
/**
     * 
@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.
classnew Long(1)));

        
// 调用session保存模型
        session.save(message);
        session.flush();

        
// 提交事务
        session.beginTransaction().commit();

        
// 执行一些收尾工作
        session.close();
        HibernateUtil.shutdown();
    }

}

 

8、  准备一个日志配置文件log4j.properties,用于监视hibernate如何启动及查看hibernate映射的sql语句;这个文件网上海的很,随便搜索一个即可,这里提供一个参考版本:

 

### direct log messages to stdout ###
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

……

hibernate:

    insert

    into

        Message

        (NEXT_MESSAGE_ID, text)

    values

        (?, ?)

   

信息的上半部分是利用hibernate tools更新表结构;下半部分是hibernate执行保存操作时生成的sql语句。这时你可以打开你的数据库,查看数据是否已经保存成功吧~It’s here~

 

到此为止,整篇hibernate3入门文章已经结束,由于不太会写文章,所以尽量以图片跟代码来代替文字,还望大家见谅。加之本人水平有限,文中如有不足或者错误之处,还望大家不吝赐教,谢谢!最后祝大家暑假愉快,工作顺利!

 

Java 咖啡群欢迎大家加入 ( 加群者送分 , 顶帖者也送分哈 ), 群号 :60446231
本群以讨论 IT 行业话题为主 , 本着交流信息的原则 , 为大家营造一个轻松欢娱的环境 , 给平时枯燥的工作增添一些调味剂 .
当然 , 技术问题同样在讨论范围之中 .
本人在这里欢迎大家的到来 , 并预祝大家五一快乐 .( 鼓掌 ... 谢谢 ... 嘿嘿 ...)
 
Java 基础群 :49827836
java 初学者提供帮助,在讨论及解决问题中共同成长。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值