(可参考Hibernate中文文档--附件下载)
[align=center][size=medium] 第一个Hibernate应用程序 [/size][/align]

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

我们所做的第一件事就是把所有需要用到的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。

[b]二、第一个class [/b]

我们的第一个持久化类是一个带有一些属性(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。

[b]三、映射文件 [/b]
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的主要配置。

[b]四、Hibernate配置[/b]
现在我们已经有了一个持久化类和它的映射文件,该是配置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&characterEncoding=utf8&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的配置文件。

[b]五、启动和辅助类 [/b]
我们启动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来做些真正的工作。

[b]六、加载并存储对象 [/b]
我们终于可以使用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中文文档)

Hibernate 入门----第一个Hibernate应用程序相关推荐

  1. 新手上路之Hibernate:第一个Hibernate例子

    一.Hibernate概述 (一)什么是Hibernate? Hibernate核心内容是ORM(关系对象模型).可以将对象自动的生成数据库中的信息,使得开发更加的面向对象.这样作为程序员就可以使用面 ...

  2. 【SpringMVC 之应用篇】 1_SpringMVC入门 —— 第一个 Spring MVC 程序

    第一个 Spring MVC 程序 一.配置文件类 在创建Spring MVC的时候,最基础的就是3个配置文件 pom.xml pom.xml 就是导入依赖 <dependencies>& ...

  3. revit二次开发概念_BIM百科 | Revit二次开发入门--创建一个简单的程序

    获取<每日一技,我的成长轨迹>汇总 · 请访问柏慕联创官方网站: www.lcbim.com · 创建一个简单的Revit外部命令程序[Revit2017+VS2015]: 1.打开VS, ...

  4. Revit二次开发入门--创建一个简单的程序

    创建一个简单的Revit外部命令程序[Revit2017+VS2015]: 1.打开VS,我的版本是VS2015,点击[新建项目]→[Visual C#]→[类库],然后输入程序名称,如:Hello ...

  5. bim 二次开发c语言,BIM百科 | Revit二次开发入门--创建一个简单的程序①

    获取<每日一技,我的成长轨迹>汇总 · 请访问柏慕联创官方网站: www.lcbim.com · Revit插件制作实例步骤: 1.创建你的第一步骤插件 启动 Visual C# 速成版开 ...

  6. hibernate入门干货

    @hibernate入门干货 一.Hibernate基础知识 纯干货,没有任何添加素 1.什么是Hibernate? Hibernate是一个开放源代码的对象关系映射框架,它对 JDBC进行了非常轻量 ...

  7. Hibernate→ORM、简介、第一个Hibernate实现、核心XML配置、Hibernate执行流程、操作数据库对象session、事务、映射XML配置、单例CRUD、get与load

    OMR Hibernate 官网 http://hibernate.org/ 第一个Hibernate实现 配置文件 持久化类 关系映射文件 测试类 代码 hibernate.cfg.xml常用配置 ...

  8. ssh架构之hibernate(一)简单使用hibernate完成CRUD

    1.Hibernate简介   Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,h ...

  9. Hibernate入门第三讲——Hibernate的常见配置

    在<Hibernate入门第一讲--Hibernate框架的快速入门>一讲中,我有讲到Hibernate的两个配置文件,今天就来详细地介绍这两个配置文件.在Hibernate中,我们主要使 ...

最新文章

  1. 手动编写第一个javaWEB文件
  2. python处理excel-使用python将数据写入excel
  3. android R文件丢失
  4. C++中了类继承和调用父类的构造函数方法
  5. mina mysql_Mina学习笔记(二)
  6. JavaOne 2012:非阻塞数据结构如何工作?
  7. Joseph Problem(解约瑟夫问题)
  8. java svn配置环境变量,Android环境变量配置和安装SVN
  9. 本地Apache服务器访问时502 Server dropped connection 错误解决方法
  10. 《CLR via C#》之运行时序列化
  11. udacity-谷歌自动驾驶-课程笔记-localization
  12. 数学——Lipschitz连续
  13. 如何打开损坏的PDF文件查看内容并修复
  14. 弗洛伊德算法(floyd)
  15. STM32 hal库串口空闲中断最新用法
  16. 计算机日常故障DIY维修有哪些,计算机维护 DIY 完全手册
  17. ESB-企业服务总线
  18. NBA历史连胜记录和连胜记录及不可超越的记录
  19. OCP 1Z0 052 141
  20. 仿网易新闻客户端UI界面小Demo

热门文章

  1. 计组之数据运算:8、c语言之强制类型转化、数据的存储与排序(大小端、字节对齐)
  2. windows下使用net-snmp实现agent扩展(一)
  3. [置顶] 运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy),三大件(bigthree problem)...
  4. 看周志华教授的一番话有感
  5. 【C/C++】递归算法
  6. F2812 DSP程序运行在片内RAM和FLASH的区别
  7. [转]图片处理函数(自适应缩略图datatable中添加缩略图像)
  8. RAC 安装完成后 节点间通信不依赖于SSH
  9. JCG新年献礼,JHR-N825R给力上市
  10. 终于有人把数据中台讲明白了