Hibernate 入门----第一个Hibernate应用程序
(可参考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应用程序相关推荐
- 新手上路之Hibernate:第一个Hibernate例子
一.Hibernate概述 (一)什么是Hibernate? Hibernate核心内容是ORM(关系对象模型).可以将对象自动的生成数据库中的信息,使得开发更加的面向对象.这样作为程序员就可以使用面 ...
- 【SpringMVC 之应用篇】 1_SpringMVC入门 —— 第一个 Spring MVC 程序
第一个 Spring MVC 程序 一.配置文件类 在创建Spring MVC的时候,最基础的就是3个配置文件 pom.xml pom.xml 就是导入依赖 <dependencies>& ...
- revit二次开发概念_BIM百科 | Revit二次开发入门--创建一个简单的程序
获取<每日一技,我的成长轨迹>汇总 · 请访问柏慕联创官方网站: www.lcbim.com · 创建一个简单的Revit外部命令程序[Revit2017+VS2015]: 1.打开VS, ...
- Revit二次开发入门--创建一个简单的程序
创建一个简单的Revit外部命令程序[Revit2017+VS2015]: 1.打开VS,我的版本是VS2015,点击[新建项目]→[Visual C#]→[类库],然后输入程序名称,如:Hello ...
- bim 二次开发c语言,BIM百科 | Revit二次开发入门--创建一个简单的程序①
获取<每日一技,我的成长轨迹>汇总 · 请访问柏慕联创官方网站: www.lcbim.com · Revit插件制作实例步骤: 1.创建你的第一步骤插件 启动 Visual C# 速成版开 ...
- hibernate入门干货
@hibernate入门干货 一.Hibernate基础知识 纯干货,没有任何添加素 1.什么是Hibernate? Hibernate是一个开放源代码的对象关系映射框架,它对 JDBC进行了非常轻量 ...
- Hibernate→ORM、简介、第一个Hibernate实现、核心XML配置、Hibernate执行流程、操作数据库对象session、事务、映射XML配置、单例CRUD、get与load
OMR Hibernate 官网 http://hibernate.org/ 第一个Hibernate实现 配置文件 持久化类 关系映射文件 测试类 代码 hibernate.cfg.xml常用配置 ...
- ssh架构之hibernate(一)简单使用hibernate完成CRUD
1.Hibernate简介 Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,h ...
- Hibernate入门第三讲——Hibernate的常见配置
在<Hibernate入门第一讲--Hibernate框架的快速入门>一讲中,我有讲到Hibernate的两个配置文件,今天就来详细地介绍这两个配置文件.在Hibernate中,我们主要使 ...
最新文章
- 手动编写第一个javaWEB文件
- python处理excel-使用python将数据写入excel
- android R文件丢失
- C++中了类继承和调用父类的构造函数方法
- mina mysql_Mina学习笔记(二)
- JavaOne 2012:非阻塞数据结构如何工作?
- Joseph Problem(解约瑟夫问题)
- java svn配置环境变量,Android环境变量配置和安装SVN
- 本地Apache服务器访问时502 Server dropped connection 错误解决方法
- 《CLR via C#》之运行时序列化
- udacity-谷歌自动驾驶-课程笔记-localization
- 数学——Lipschitz连续
- 如何打开损坏的PDF文件查看内容并修复
- 弗洛伊德算法(floyd)
- STM32 hal库串口空闲中断最新用法
- 计算机日常故障DIY维修有哪些,计算机维护 DIY 完全手册
- ESB-企业服务总线
- NBA历史连胜记录和连胜记录及不可超越的记录
- OCP 1Z0 052 141
- 仿网易新闻客户端UI界面小Demo
热门文章
- 计组之数据运算:8、c语言之强制类型转化、数据的存储与排序(大小端、字节对齐)
- windows下使用net-snmp实现agent扩展(一)
- [置顶] 运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy),三大件(bigthree problem)...
- 看周志华教授的一番话有感
- 【C/C++】递归算法
- F2812 DSP程序运行在片内RAM和FLASH的区别
- [转]图片处理函数(自适应缩略图datatable中添加缩略图像)
- RAC 安装完成后 节点间通信不依赖于SSH
- JCG新年献礼,JHR-N825R给力上市
- 终于有人把数据中台讲明白了