1. 建立项目文件系统结构
HelloWorld
-src
+lib
+bin(或者build)
所需要的包
-lib
antlr-2.7.6.jar
dom4j-1.6.1.jar
hibernate3.jar
javassist-3.9.0.GA.jar
mysql-connector-java-5.0.8-bin.jar (使用Mysql数据库)
slf4j-api-1.5.8.jar
slf4j-simple-1.5.8.jar(或slf4j-jdk14-1.5.8.jar或slf4j-log4j12-1.5.8.jar(兼容之前使用log4j的hibernate版本))
(Hibernate 3.3.2 GA 不再使用log4j, 使用slf4j-Simple Logging Facade for Java )
2. 选择开发方式:
(1) 从上至下,先根据业务模型设计Java类,然后通过hbm2ddl等工具生成数据库schema, 适合大多数项目开发。
(2) 从下至上,先设计数据库的schema, 再通过hbm2java等工具生成Java持久类。
(3) 从中间至上下,由xml文件开始,至上生成Java类, 至下生成schema,适合专家
(4) 混合模式, 有Java类,又有数据库schema, 比较困难
选择第一种方式。
3. 编写Java持久类
要求:
(1) 要有有标示符(identifier), 标示符可以为null即不是primitive type
(2) 要有没有参数的构造方法
(3) 类不是final的和没有public final的方法,否则会影响hibernate的lazy加载。
(4) 为fields编写setter和getter方法。
(5) 如果对象放在Set中或离线后重新在线,重载overriding equals和hashCode方法。
下面是一个POJO,将使用hibernate保存到数据库中。
package hello;
import java.util.Date;
public class Event{
private Long id; //identifier
private String text;
private Date date;
private Event nextEvent;
public Event() {}
//set方法为私有, id由hibernate管理
private void setId(){
this.id=id;
}
public Long getId(){
return this.id;
}
保存在src/hello/
//.....以下fields的setter和getter方法略
4. ORM映射文件
相应的dtd可以hibernate的src中找到,建议放在项目的src文件夹中
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="hello">
<class name="Event" table="EVENTS">
<id name="id" column="EVENT_ID">
<generator class="native" />
</id>
<property name="text" />
<property name="date" type="timestamp" column="EVENT_DATE" />
<!-- 多对一关系-->
<many-to-one name="nextEvent" column="NEXT_EVENT_ID" />
</class>
</hibernate-mapping>
保存为 src/hello/Event.hbm.xml (也可以保存在src下面)
6. Hibernate配置文件 hibernate.cfg.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">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost/test</property>
<property name="connection.username">root</property>
<property name="connection.password">197726</property>
<!-- JDBC Connection Pool(use built-in) -->
<property name="connection.pool_size">1</property>
<!-- SQL Dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Enable Hibernate's automatic session 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>
<!-- Drop and recreate the database schema on startup -->
<property name="hbm2ddl.auto">update</property>
<!-- 此处映射文件的路径相对于classpath的根(src目录) -->
<!--如果此处不加入mapping资源,则需要在代码里手工加载-->
<!-- hbm.xml文件位于包路径下 -->
<mapping resource="hello/Event.hbm.xml" />
<!-- hbm.xml文件位于classpath根路径下即src目录 -->
<!-- <mapping resource="Event.hbm.xml" /> -->
</session-factory>
</hibernate-configuration>
将此文件保存为hibernate.cfg.xml在src中。若存为其他名称则需要在Configuration.config()方法中将名称作为参数提供。
7. 实用类HibernateUtil
该类用于方便的获得SessionFactory。SessionFactory为应用程序的全局变量,用于获得Session对象。通常一个SessionFactory对应一个数据库。在hibernate启动时构造一个SessionFactory对象并在整个应用程序共享。SessionFactory对象是线程安全的,并且应该只被初始化一次(即hibernate启动时)。
Session对象是单线程的,代表一批次工作(a unit of work)。
package hello;
import org.hibernate.*;
public class HibernateUtil{
private static SessionFactory sessionFactory;
static{
try{
sessionFactory=new Configuration().configure();
//如果配置文件不是默认名称hibernate.cfg.xml
//sessionFactory=new Configuration().configure("anothername.cfg.xml");
//如果配置文件中没有加入mapping resource
//指定资源在classpath下(即src目录),此时Event.hbm.xml应在src目录下,而不在包路径下,否则会找不到
//sessionFactory=new Configuration().configure().addResource("Event.hbm.xml");
//指定在包路径下寻找Event.hbm.xml
//sessionFactory=new Configuration().configure().addClass("Event.class");
}
catch(Trowable ex){
System.err.println("Initial SessionFactory creation failed. "+ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
}
8. 运行并测试