在所有的ORM框架都有一个非常重要的媒介:PO类,也就是持久化对象。通过该对象可以对数据进行增删改查的操作,就可以以面向对象的方式操作数据库了。
Hibernate的PO对象是非常简单的,完成使用普通的java对象(pojo)作为持久化对象使用。以下就是一个PO 类:
package org.liqin;
import javax.persistence.*;
@Entity
@Table(name="news_inf")
public class News
{
// 消息类的标识属性
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
// 消息标题
private String title;
// 消息内容
private String content;
// id的setter和getter方法
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return this.id;
}
// title的setter和getter方法
public void setTitle(String title)
{
this.title = title;
}
public String getTitle()
{
return this.title;
}
// content的setter和getter方法
public void setContent(String content)
{
this.content = content;
}
public String getContent()
{
return this.content;
}
}
从上面可以看出hibernate直接使用普通的java对象(pojo)作为持久化类。为了使普通的java类具有持久化操作的能力还需要添加一些注解。
1.@Entity:声明该类使Hibeinate持久化类。
2.@Table(name="表名"):指定该类映射的表。
3.@Id: 指定该类的标识属性。
4.@GeneratedValue(strategy=GenerationType.IDENTITY) :指定主键生策略,IDENTITY为自动增长。
也就是说PO = pojo+注解.
除了持久化类之外,还需要配置数据库信息,可以通过*.properties属性文件,也可以通过XML 文件配置,在实际运用中,通常使用 XML文件配置。
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 指定连接数据库所用的驱动 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 指定连接数据库的url,其中hibernate是本应用连接的数据库名 -->
<property name="connection.url">jdbc:mysql://localhost/hibernate</property>
<!-- 指定连接数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 指定连接数据库的密码 -->
<property name="connection.password">32147</property>
<!-- 指定连接池里最大连接数 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 指定连接池里最小连接数 -->
<property name="hibernate.c3p0.min_size">1</property>
<!-- 指定连接池里连接的超时时长 -->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 指定连接池里最大缓存多少个Statement对象 -->
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">true</property>
<!-- 指定数据库方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 根据需要自动创建数据表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 显示Hibernate持久化操作所生成的SQL -->
<property name="show_sql">true</property>
<!-- 将SQL脚本进行格式化后再输出 -->
<property name="hibernate.format_sql">true</property>
<!-- 罗列所有持久化类的类名 -->
<mapping class="org.liqin"/>
</session-factory>
</hibernate-configuration>
Hibernate配置文件的默认名为hibernate.cfg.xml,当程序调用configuration对象的configure方法时将自动加载该文件.
Hibernate配置文件的根的元素是<hibernate-configuration>,里面有<session-factory>子元素,该元素依次有很多<property.../>子元素,这些<property.../>事配置数据库连接信息的必要信息,如驱动,url,用户名,密码等。Hibernate推荐使用C3P0数据源。
<property name="hbm2ddl.auto">update</property>是配置是否根据持久化。
<session-factory>能配置多个<mapping class="类名"/>,每个<mappping.../>指定一个持久化类。
package liqin;
import org.hibernate.*;
import org.hibernate.cfg.*;
import org.hibernate.service.*;
import org.hibernate.boot.registry.*;
import org.crazyit.app.domain.*;
public class NewsManager
{
public static void main(String[] args)
throws Exception
{
// 实例化Configuration,
Configuration conf = new Configuration()
// 不带参数的configure()方法默认加载hibernate.cfg.xml文件,
// 如果传入abc.xml作为参数,则不再加载hibernate.cfg.xml,改为加载abc.xml
.configure();
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(conf.getProperties()).build();
// 以Configuration实例创建SessionFactory实例
SessionFactory sf = conf.buildSessionFactory(serviceRegistry);
// 创建Session
Session sess = sf.openSession();
// 开始事务
Transaction tx = sess.beginTransaction();
// 创建消息对象
News n = new News();
// 设置消息标题和消息内容
n.setTitle("csdn");
n.setContent("csdn,"
+ "csdn);
// 保存消息
sess.save(n);
// 提交事务
tx.commit();
// 关闭Session
sess.close();
sf.close();
}
}
如上面所示,在调用session.save(n);之前,需要获取session对象。PO只有在Session的管理下才能完成数据库访问,为了使用Hibernate进行持久化操作,通常有以下操作步骤:
1:开发持久化类
2:获取Configuration
3:获取sessionfactory
4:获取 Session,打开事务
5:用面向对象的方式操作数据库
6:关闭事务,关闭Session
根据PO与Session的关系,PO有三种状态:
1:瞬态——未与session关联
2:持久态——与session关联,且该实例对应到数据库纪录
3:脱管——曾与session关联,但是脱离额session的管理
Session是由SessionFactory工厂产生,SessionFactory是数据库编译后产生的内存镜像,通常一个应用对应一个SessionFactory对象,SessionFactory对象是由Configuration对象生成。Configuration对象负责加载hibernate配置文件。