1,POJO
POJO在Hibernate语义中理解为数据库表所对应的Domain Object。这里的POJO就是所谓的"Plain Ordinary Java Object",字面上讲就是无格式普通Java对象,简单的可以理解为一个不包含逻辑代码的值对象(Value Object---VO)。
一个典型的POJO:
public class TUser implements Serializable {
private String name;
public User(String name) {
this.name = name;
}
/** default constructor */
public User() {
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
2,Hibernate映射文件
Hibernate从本质上来讲是一种"对象-关系型数据映射"(Object Relational Mapping---ORM)。前面的POJO在这里体现的就是ORM中Object层的语义。而映射(Mapping)文件则是将对象(Object)与关系型数据库(Relational)相关联的纽带,在Hibernate中,映射文件通常以".hbm.xml"作为后缀。
由数据库产生基础代码
通过Hibernate官方提供的MiddleGen for Hibernate和Hibernate_Extension工具包,我们可以很方便的根据现有数据库,导出数据库表结构,生成ORM和POJO。
Hibernate配置
前面已经得到了映射文件和POJO,为了使Hibernate能真正运作起来,我们还需要一个配置文件。
Hibernate同时支持XML格式的配置文件,以及传统的properties文件配置方式,不过这里建议采用XML型配置文件。XML配置文件提供了更易于读的结构和更强的配置能力,可以直接对映射文件加以配置,而在properties文件中则无法配置,必须通过代码中的Hard Coding加载对应的映射文件。
配置文件名默认为hibernate.cfg.xml(或者 hibernate.properties),Hibernate初始化期间会自动在CLASSPATH中寻找这个文件,并读取其中的配置信息,为后期数据库操作做好准备。
配置文件应部署在CLASSPATH中,对于WEB应用而言,配置文件应放置在/WEB-INF/classes目录下。
一个典型的hibernate.cfg.xml配置文件如下:
http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd">
jdbc:mysql://localhost/sample
org.gjt.mm.mysql.Driver
User
Mypass
net.sf.hibernate.dialect.MySQLDialect
True
True
net.sf.hibernate.transaction.JDBCTransactionFactory
一个典型的hibernate.properties配置文件如下:
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class org.gjt.mm.mysql.Driver
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql:///sample
hibernate.connection.username user
hibernate.connection.password mypass
第一段代码
下面这段代码是一个JUnit TestCase,演示了Tuser对象的保存和读取。
public class hiberanteTest extest TestCase {
Session session = null;
/**
*JUnit中setUp方法在TestCase初始化的时候会自动调用
*一般用于初始化公有资源
*此例中,用于初始化Hibernate Session
*/
protected void setUp() {
try {
/**
*采用hibernate.properties配置文件的初始化代码:
*Configuration config = new Configuration();
*config.addClass(TUser.class);
*/
//采用hibernate.cfg.xml配置文件
//请注意初始化Configuration时的差异:
//1,Configuration的初始化方式
//2,xml文件中已经定义了Mapping文件,因此无需再Hard Coding导入POJO文件的定义。
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSesssionFactory();
session = sessionFactory.openSession();
}catch(HibernateException e) {
e.printStackTrace();
}
}
/*
*与setUp方法相对应,JUnit TestCase执行完毕时,会自动调用tearDown方法,一般用于资源释放
*此例中,用于关闭在setUp方法中打开的Hibernate Session
*/
protected void tearDown() {
try {
session.close();
}catch(HibernateException e) {
e.printStackTrace();
}
}
/**
*对象持久化(Insert)测试方法
*JUnit中,以"test"作为前缀的方法为测试方法,将被JUnit自动添加到测试计划中运行
*/
public void testInsert() {
try {
TUser user = new TUser();
user.setName("Emma");
session.save(user);
session.flush();
}catch(HibernateException e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
/**
*对象读取(Select)测试
*请保证运行之前数据库中已经存在name='Erica'的记录
*/
public void testSelect() {
String hql = " from TUser where name = 'Erica'";
try {
List userList = session.find(hql);
TUser user = (TUser)userList.get(0);
Asset.assertEquals(user.getName(),"Erica");
}catch(HibernateException e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
}
同时我们已经成功实现了一个简单的TUser实例的保存和读取。可以看到,程序中通过少量代码实现了Java对象和数据库数据的同步,同时借助Hibernate的有力支持,轻松实现了对象到关系型数据库的映射。
相对传统的JDBC数据访问模式,这样的实现无疑更符合面向对象的思想,同时也大大提高了开发效率。
上面的代码中引入了几个Hibernate基础语义:
1)Configuration
2)SessionFactory
3)Session
下面就这几个关键概念进行探讨。
Hibernate基础语义
1,Configuration
正如其名,Configuration类负责管理Hibernate的配置信息。Hibernate运行时需要获取一些底层实现的基本信息,其中关键属性包括:
1)数据库URL
2)数据库用户
3)数据库用户密码
4)数据库JDBC驱动类
5)数据库dialect,用于对特定数据库提供支持,其中包括了针对特定数据库特性的实现,如Hibernate数据库类型到特定数据库数据类型的映射等。
当我们调用:Configuration config = new Configuration().configure();时,Hibernate会自动在当前的CLASSPATH中搜寻hibernate.cfg.xml文件并将其读取到内存中作为后续操作的基本配置。Configuration类一般只有在获取SessionFactory时需要涉及,当获取SessionFactory之后,由于配置信息已经由Hibernate维护并绑定在返回的SessionFactory之上,因此一般情况下无需再对其进行操作。
我们也可以指定配置文件名,如果不希望使用默认的hibernate.cfg.xml文件作为配置文件的话:
File file = new File("c:samplemyhibernate.xml");
Configuration config = new Configuration().configure(file);
SessionFactory
SessionFactory负责创建Session实例。我们可以通过Configuration实例构建SessionFactory:
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Configuration实例config会根据当前的配置信息,构造SessionFactory实例并返回。SessionFactory一旦构造完毕,即被赋予特定的配置信息。也就是说,之后config的任何变更将不会影响到已经创建的SessionFactory实例(sessionFactory)。如果需要使用基于改动后的config实例的sessionFactory,需要从config重新构建一个SessionFactory实例。
Session
Session是持久层操作的基础,相当于JDBC中的Connection。
Session实例通过SessionFactory实例构建:
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
之后我们就可以调用Session所提供的save,find,flush等方法完成持久层操作:
1)Find:
String hql = " from TUser where name='Erica'";
List userList = session.find(hql);
2)Save:
TUser user = new TUser();
user.setName("Emma");
session.save(user);
session.flush();
最后调用Session.flush方法强制数据库同步,这里即强制Hibernate将user实例立即同步到数据库中。如果在事务中则不需要flush方法,在事务提交的时候,hibernate自动会执行flush方法,另外当Session关闭时,也会自动执行flush方法。