`
ganshisheng
  • 浏览: 41965 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate 入门----第一个Hibernate应用程序

阅读更多
(可参考Hibernate中文文档--附件下载)
第一个Hibernate应用程序


一、首先我们将创建一个简单的基于控制台的(console-based)Hibernate应用程序。

我们所做的第一件事就是把所有需要用到的Java库文件放进开发的目录中。解压缩从Hibernate网站下载的Hibernate发布包,并把库文件拷到我们新建开发目录下的/lib目录下。看起来就像这样:
.
+lib
  antlr.jar
  cglib.jar
  asm.jar
  asm-attrs.jars
  commons-collections.jar
  commons-logging.jar
  ehcache.jar
  hibernate3.jar
  jta.jar
  dom4j.jar


假设我们希望有一个小应用程序可以保存和查询events(活动)。

接下来我们创建一个类,用来代表那些我们希望储存在数据库里的event。


二、第一个class

我们的第一个持久化类是一个带有一些属性(property)的简单JavaBean类:

package events;

import java.util.Date;

public class Event {
    private Long id;

    private String title;
    private Date date;

    public Event() {}

    // ...getter/setter省略
}


把这个Java源代码文件放到开发目录下的src目录里,注意包位置要正确。 现在这个目录看起来应该像这样:

.
+lib
  <Hibernate and third-party libraries>
+src
  +events
    Event.java


下一步,我们把这个持久化类的信息告诉Hibernate。


三、映射文件
Hibernate需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是Hibernate映射文件发挥作用的地方。映射文件告诉Hibernate它,应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。 

我们在映射文件里面包含需要持久化属性的声明。默认情况下,类里面的属性都被视为非持久化的:

<hibernate-mapping>

    <class name="events.Event" table="EVENTS">
        <id name="id" column="EVENT_ID">
            <generator class="native"/>
        </id>
        <property name="date" type="timestamp" column="EVENT_DATE"/>
        <property name="title"/>
    </class>

</hibernate-mapping>


把这个映射文件保存为Event.hbm.xml,放在EventJava类的源文件目录下。映射文件可随意地命名,但hbm.xml的后缀已成为Hibernate开发者社区的约定。现在目录结构看起来应该像这样:

.
+lib
  <Hibernate and third-party libraries>
+src
 +events
  Event.java
  Event.hbm.xml


我们继续进行Hibernate的主要配置。 


四、Hibernate配置
现在我们已经有了一个持久化类和它的映射文件,该是配置Hibernate的时候了。在此之前,我们需要一个数据库。在这里,我们使用MySQL数据库, 你只需下载 mysql-connector-java-3.1.1-alpha-bin.jar文件,并把这个文件放在开发文件夹的lib/目录下即可。 

Hibernate是你的应用程序里连接数据库的那层,所以它需要连接用的信息。连接是通过一个也由我们配置的JDBC连接池(connection pool)来完成的。注意,如果你希望使用其他的第三方连接池软件,你必须拷贝所需的库文件到你的classpath下,并使用不同的连接池设置。

为了保存Hibernate的配置,我们可以使用一个简单的hibernate.properties文件,或者一个稍微复杂的hibernate.cfg.xml,甚至可以完全使用程序来配置Hibernate。多数用户更喜欢使用XML配置文件:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">org.gjt.mm.mysql.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf8&amp;useServerPrepStmts=false</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <mapping resource="events/Event.hbm.xml"/>

    </session-factory>

</hibernate-configuration>


把这个文件拷贝到源代码目录下面,这样它就位于classpath的根目录(/src/)的最后。Hibernate在启动时会自动在classpath的根目录查找名为hibernate.cfg.xml的配置文件。


五、启动和辅助类
我们启动Hibernate时要创建一个全局的SessoinFactory,SessionFactory可以创建并打开新的Session。一个Session代表一个单线程的单元操作,SessionFactory则是个线程安全的全局对象,只需要被实例化一次。

我们将创建一个HibernateUtil辅助类(helper class)来负责启动Hibernate和更方便地操作SessionFactory。让我们来看一下它的实现:

package util;

import org.hibernate.*;
import org.hibernate.cfg.*;

public class HibernateUtil {

    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory from hibernate.cfg.xml
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Make sure you log the exception, as it might be swallowed
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }

}

这个类不但在它的静态初始化过程(仅当加载这个类的时候被JVM执行一次)中产生全局的SessionFactory,而且隐藏了它使用了静态singleton的事实。它也可能在应用程序服务器中的JNDI查找SessionFactory。

把HibernateUtil.java放在开发目录的源代码路径下,与放events的包并列:
.
+lib
  <Hibernate and third-party libraries>
+src
  +events
    Event.java
    Event.hbm.xml
  +util
    HibernateUtil.java
  hibernate.cfg.xml


示例的基本框架完成了 - 现在我们可以用Hibernate来做些真正的工作。

六、加载并存储对象
我们终于可以使用Hibernate来加载和存储对象了,编写一个带有main()方法的EventManager类:

package events;
import org.hibernate.Session;

import java.util.Date;

import util.HibernateUtil;

public class EventManager {

    public static void main(String[] args) {
        EventManager mgr = new EventManager();

        if (args[0].equals("store")) {
            mgr.createAndStoreEvent("My Event", new Date());
        }
	else if (args[0].equals("list")) {
	    List events = mgr.listEvents();
	    for (int i = 0; i < events.size(); i++) {
	    Event theEvent = (Event) events.get(i);
	    System.out.println("Event: " + theEvent.getTitle() +
                           " Time: " + theEvent.getDate());
    }
}

        HibernateUtil.getSessionFactory().close();
    }

    private void createAndStoreEvent(String title, Date theDate) {

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();

        session.beginTransaction();

        Event theEvent = new Event();
        theEvent.setTitle(title);
        theEvent.setDate(theDate);

        session.save(theEvent);

        session.getTransaction().commit();
    }
    private List listEvents() {

	Session session = HibernateUtil.getSessionFactory().getCurrentSession();

	session.beginTransaction();

	 List result = session.createQuery("from Event").list();

	 session.getTransaction().commit();

	 return result;
    }

}

可以在Eclipse执行Open Run Dialog...键入不同的Arguments运行不同的操作。

我们创建了个新的Event对象并把它传递给Hibernate。现在Hibernate负责与SQL打交道,并把INSERT命令传给数据库。在运行之前,让我们看一下处理Session和Transaction的代码。

sessionFactory.getCurrentSession()是干什么的呢?首先,只要你持有SessionFactory(我们通过HibernateUtil,可以随时获得),大可在任何时候、任何地点调用这个方法。getCurrentSession()方法总会返回“当前的”工作单元。

Session在第一次被使用的时候,即第一次调用getCurrentSession()的时候,其生命周期就开始。然后它被Hibernate绑定到当前线程。当事务结束的时候,不管是提交还是回滚,Hibernate会自动把Session从当前线程剥离,并且关闭它。假若你再次调用getCurrentSession(),你会得到一个新的Session,并且开始一个新的工作单元。这种线程绑定的编程模型(model)是使用Hibernate的最广泛的方式,因为它支持对你的代码灵活分层。

简单地搭建Hibernate、并完成配置至此结束!

(可参考Hibernate中文文档)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics