Hibernate3入门指南

来源:互联网 发布:js随机数 编辑:程序博客网 时间:2024/06/01 16:01

谨以此文献给还没使用但准备使用hibernate的朋友,万事开头难,我就以自己的经历来帮助大家迈出这最难的一步吧!

 

 

 

跟很多朋友一样,我初学hibernate时大费周折,看过众多的书也参与过几个跟hibernate有关的项目,但是从来没有自己去创建过一个hibernate的项目,因此我对hibernate的认识是非常肤浅的。终于有一天,我再也坐不住了,我必须创建自己的hibernate项目,我要加深对hibernate的认识,于是,我静下心来,开始了我的hibernate之旅。

一、建立第一个hibernate工程

准备工作:

1、首先到hibernate官方网(http://www.hibernate.org/)下载最新的发布版,目前是3.2.2GA,同时将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: [fk9c2397e73cd7f3ea]

18:30:51,699  INFO TableMetadata:44 - indexes: [fk9c2397e73cd7f3ea, primary]

18:30:51,699 DEBUG SchemaUpdate:149 - alter table Message add index FK9C2397E7C2F0584B (NEXT_MESSAGE_ID), add constraint FK9C2397E7C2F0584B 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初学者提供帮助,在讨论及解决问题中共同成长。