(可参考Hibernate中文文档--附件下载)
[align=center][size=medium] 第一个Hibernate应用程序 [/size][/align]
[b]一、首先我们将创建一个简单的基于控制台的(console-based)Hibernate应用程序。[/b]
我们所做的第一件事就是把所有需要用到的Java库文件放进开发的目录中。解压缩从Hibernate网站下载的Hibernate发布包,并把库文件拷到我们新建开发目录下的/lib目录下。看起来就像这样:
.
假设我们希望有一个小应用程序可以保存和查询events(活动)。
接下来我们创建一个类,用来代表那些我们希望储存在数据库里的event。
[b]二、第一个class [/b]
我们的第一个持久化类是一个带有一些属性(property)的简单JavaBean类:
把这个Java源代码文件放到开发目录下的src目录里,注意包位置要正确。 现在这个目录看起来应该像这样:
下一步,我们把这个持久化类的信息告诉Hibernate。
[b]三、映射文件 [/b]
Hibernate需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是Hibernate映射文件发挥作用的地方。映射文件告诉Hibernate它,应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column)。
我们在映射文件里面包含需要持久化属性的声明。默认情况下,类里面的属性都被视为非持久化的:
把这个映射文件保存为Event.hbm.xml,放在EventJava类的源文件目录下。映射文件可随意地命名,但hbm.xml的后缀已成为Hibernate开发者社区的约定。现在目录结构看起来应该像这样:
我们继续进行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配置文件:
把这个文件拷贝到源代码目录下面,这样它就位于classpath的根目录(/src/)的最后。Hibernate在启动时会自动在classpath的根目录查找名为hibernate.cfg.xml的配置文件。
[b]五、启动和辅助类 [/b]
我们启动Hibernate时要创建一个全局的SessoinFactory,SessionFactory可以创建并打开新的Session。一个Session代表一个单线程的单元操作,SessionFactory则是个线程安全的全局对象,只需要被实例化一次。
我们将创建一个HibernateUtil辅助类(helper class)来负责启动Hibernate和更方便地操作SessionFactory。让我们来看一下它的实现:
这个类不但在它的静态初始化过程(仅当加载这个类的时候被JVM执行一次)中产生全局的SessionFactory,而且隐藏了它使用了静态singleton的事实。它也可能在应用程序服务器中的JNDI查找SessionFactory。
把HibernateUtil.java放在开发目录的源代码路径下,与放events的包并列:
示例的基本框架完成了 - 现在我们可以用Hibernate来做些真正的工作。
[b]六、加载并存储对象 [/b]
我们终于可以使用Hibernate来加载和存储对象了,编写一个带有main()方法的EventManager类:
可以在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中文文档)
[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中文文档)