Hibernate3回顾

一、背景(部署简单回顾)

我们知道,一个Hibernate快速上手的简单流程是这样。

1引入对应jar包。

中间涉及log4的jar包和配置,略。

2 实体类

 1 package com.test.entity;
 2 import java.util.Date;
 3 
 4 /** 
 5  * 你可以看到这个类对属性的存取方法(getter  and  setter  method)使用了标准
 6 JavaBean  命名约定,同时把类属性(field)的访问级别设成私有的(private)。这是推荐的
 7 设计,但并不是必须的 */
 8 public class Event {
 9     private Long id;
10     private String title;
11     private Date date;
12 //所有的持久化类(persistent classes)都要求有无参的构造器,因为 Hibernate 必须使用 Java
13 //反射机制来为你创建对象
14     public Event() {}
15     //getter/setter
16     public Long getId() {
17         return id;
18     }
19     public void setId(Long id) {
20         this.id = id;
21     }
22     public String getTitle() {
23         return title;
24     }
25     public void setTitle(String title) {
26         this.title = title;
27     }
28     public Date getDate() {
29         return date;
30     }
31     public void setDate(Date date) {
32         this.date = date;
33     }
34 }

3实体类映射文件

Event.hbm.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <hibernate-mapping package="org.hibernate.tutorial.domain">
 5     <class name="Event" table="EVENTS">
 6         <id name="id" column="EVENT_ID">
 7             <generator class="native" />
 8         </id>
 9     </class>
10     <property name="date" type="timestamp" column="EVENT_DATE" />
11     <property name="title" />
12 </hibernate-mapping>

4配置hibernate.properties或者hibernate.cfg.xml文档

 1 <?xml version=‘1.0‘ encoding=‘UTF-8‘?>
 2 <!DOCTYPE hibernate-configuration PUBLIC
 3           "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 4           "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
 5 <!-- Generated by MyEclipse Hibernate Tools.                   -->
 6 <hibernate-configuration>
 7     <session-factory>
 8         <!--
 9             具体的配置信息可参见hibernate_home/etc/hibernate.properties相关配置项 
10             如何要移植数据时,只要将下面数据库信息修改就可以了。
11          -->
12         <!-- 配置mysql数据库连接串 -->
13         <property name="hibernate.connection.url">jdbc:mysql://localhost:3036/hibernate_first</property>
14         <!-- 配置mysql数据库jdbc驱动 -->
15         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
16         <!-- 配置mysql数据库连接用户名 -->
17         <property name="hibernate.connection.username">root</property>
18         <!-- 配置mysql数据库连接用户密码 -->
19         <property name="hibernate.connection.password">root</property>
20         <!--配置数据库适配器(使用何中数据库)-->
21         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
22          <!-- 是否显示hibernate的SQL语句 -->
23         <property name="hibernate.show_sql">true</property>
24       <!-- 实体类导出至数据库时,如果存在的表处理方式:
25             hibernate.hbm2ddl.auto :(create-drop、create、update、validate)
26          -->
27         <property name="hibernate.hbm2ddl.auto">update</property>
28 <!-- 配置实体类映射文件 位于property之后 
29              映射文件要求为完整路径,目录之前使用/隔开 
30 -->
31         <mapping resource="com/test/mapping/Event.hbm.xml"/>
32 </session-factory>
33 </hibernate-configuration>

 

5-1启动

方式一使用hibernate工具类将对象模型生成关系模型(hbm to ddl)

(也就是实体类生成数据库中的表)

 1 import org.hibernate.cfg.Configuration;
 2 import org.hibernate.tool.hbm2ddl.SchemaExport;
 3 /**
 4  * Hibernate工具<br/>
 5  * 将对象模型生成关系模型(将对象生成数据库中的表)
 6  * 把hbm映射文件转换成DDL
 7  * 生成数据表之前要求已经存在数据库
 8  * 注:这个工具类建立好后,以后就不用建立了。以后直接Copy来用。
 9 /
10 public class ExportDB {
11     public static void main(String[] args){
12         /*
13          * org.hibernate.cfg.Configuration类的作用:
14          * 读取hibernate配置文件(hibernate.cfg.xml或hiberante.properties)的.
15          * new Configuration()默认是读取hibernate.properties
16          * 所以使用new Configuration().configure();来读取hibernate.cfg.xml配置文件
17          */
18         Configuration cfg = new Configuration().configure();
19         
20         /*
21          * org.hibernate.tool.hbm2ddl.SchemaExport工具类:
22          * 需要传入Configuration参数
23          * 此工具类可以将类导出生成数据库表
24          */
25         SchemaExport export = new SchemaExport(cfg);
26         
27         /*
28          * 开始导出
29          * 第一个参数:script 是否打印DDL信息
30          * 第二个参数:export 是否导出到数据库中生成表
31          */
32         export.create(true, true);
33         
34     }
35 }

5-2启动

方式二:将引用部署于web容器。根据hibernate.cfg.xml中的配置:

<property name="hibernate.hbm2ddl.auto">create 或者update</property> Hibernate将自动更新表格结构。

6 client常规操作

以下代码来源wtj276

 1 import java.util.Date;
 2 import org.hibernate.Session;
 3 import org.hibernate.SessionFactory;
 4 import org.hibernate.cfg.Configuration;
 5 
 6 public class Client {
 7 
 8     public static void main(String[] args){
 9         
10         //1读取hibernate.cfg.xml文件
11         Configuration cfg = new Configuration().configure();
12         
13         /*
14          * 2创建SessionFactory
15          * 一个数据库对应一个SessionFactory 
16          * SessionFactory是线程安全的。
17          */
18         SessionFactory factory = cfg.buildSessionFactory();
19         
20         //3创建session
21         //此处的session并不是web中的session,而是HibernateSession
22         //session只有在用时,才建立concation,session还管理缓存。
23         //session用完后,必须关闭。
24         //session是非线程安全,一般是一个请求一个session.
25         Session session = null;
26         
27         try {
28             
29             session = factory.openSession();
30             
31             //5手动开启事务(可以在hibernate.cfg.xml配置文件中配置自动开启事务)
32             session.beginTransaction();
33             
34             User user = new User();
35             user.setName("张三");
36             user.setPassword("123");
37             user.setCreateTime(new Date());
38             user.setExpireTime(new Date());            
39             /*
40              * 6增删改查操作
41 保存数据等操作,此处的数据是保存对象,这就是hibernate操作对象的好处,
42              * 我们不用写那么多的JDBC代码,只要利用session操作对象,至于hibernat如何存在对象,这不需要我们去关心它,
43              * 这些都有hibernate来完成。我们只要将对象创建完后,交给hibernate就可以了。
44              */
45             session.save(user);
46             
47             //7.1提交事务
48             session.getTransaction().commit();
49             
50         } catch (Exception e) {
51             e.printStackTrace();
52             //7.2异常,回滚事务
53             session.getTransaction().rollback();
54         } finally {
55             if (session != null) {
56                 //8关闭session
57                 session.close();
58             }
59         }        
60     }
61 }

为了方便跟踪sql语句执行,可以在hibernate.hbm.xml中加入下以代码:

<property name="hibernate.show_sql">true</property>

 完成

二、几个概念

Configuration

Hibernate Configuration是hibernate的入口,用于读取Hibernate的配置信息。新建一个Configuration的实例的时候,hibernate默认会在classpath里面查找hibernate.properties文件,并将该文件的内容加载到一个Properties的实例GLOBAL_PROPERTIES中。也可指定configuration加载某文件。

 

参考上文中实例化代码:

Configuration config = new Configuration().configure();

configura()方法:用于告诉Hibernate加载hibernate.cfg.xml文件。Configuration在实例化时默认加载classpath中的hibernate.cfg.xml,当然也可以加载名称不是hibernate.cfg.xml的配置文件,例如wghhibernate.cfg.xml,可以通过以下代码实现。

Configuration config = new Configuration().configure("wghhibernate.cfg.xml");

SessionFactiory

Configuration的实例会根据当前的配置信息,构造SessionFactory实例。SessionFactory是线程安全的,一般情况下一个应用中一个数据库共享一个SessionFactory实例。SessionFactory接口提供Session类的实例,Session类用于完成对数据库的操作。由于SessionFactory实例是线程安全的(而Session实例不是线程安全的),所以每个操作都可以共用同一个SessionFactory来获取Session。

参考上文中实例化代码:

SessionFactory factory = cfg.buildSessionFactory();

 

Hibernate Session

Hibernate session为hibernate操作数据库的一个句柄对象。表示操作数据库的一个会话。

一般的持久化方法(CRUD)都是通过Session来调用的,Session是非线程安全的。

Session的创建与关闭 :Session是一个轻量级对象,通常将每个Session实例和一个数据库事务绑定,也就是每执行一个数据库事务,都应该先创建一个新的Session实例,在使用Session后,还需要关闭Session。

Hibernate3回顾,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。