查看: 8475|回复: 11

[精华] Hibernate 4.1入门指南

[复制链接]
论坛徽章:
63
2010广州亚运会纪念徽章:台球
日期:2010-10-18 12:43:48茶鸡蛋
日期:2013-01-09 10:59:002013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:帆船
日期:2013-04-02 17:07:052013年新春福章
日期:2013-04-08 17:42:48奥运纪念徽章
日期:2013-07-18 13:55:12优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11
发表于 2012-6-29 16:39 | 显示全部楼层 |阅读模式
《Hibernate 4.1入门指南》
版权声明:本文属于原创,版权归作者chszs所有,使用源码无任何限制,但转载文章需经作者同意。

【写作目的】尽管好几年前就在使用Hibernate,但在近两、三年,由于其它开源框架的巨大进步,完全可以取代Hibernate的工具已经有不少了,以及我公司内部的各种原因,我们已经没再使用Hibernate了,而是使用了MyBatis 3,EclipseLink等等开源工具。而最近的一个任务是把遗留系统进行整理和改进,我们又重新捡起了Hibernate。我决定,把Hibernate 2.1升级到4.1.4版,当然代码也需做一些改进。

文章分两部分:

第一部分:基于Hibernate XML映射文件开发项目

第二部分:基于Hibernate注释
开发项目

下面请看正文:

论坛徽章:
20
马上有钱
日期:2014-03-05 18:13:002013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:072012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41迷宫蛋
日期:2011-11-07 14:46:51茶鸡蛋
日期:2011-07-11 20:36:00咸鸭蛋
日期:2011-06-30 15:11:57辩论纪念章
日期:2010-11-15 09:41:552010广州亚运会纪念徽章:网球
日期:2011-05-11 14:11:47
发表于 2012-6-29 16:48 | 显示全部楼层
坐板凳看看

使用道具 举报

回复
论坛徽章:
63
2010广州亚运会纪念徽章:台球
日期:2010-10-18 12:43:48茶鸡蛋
日期:2013-01-09 10:59:002013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:帆船
日期:2013-04-02 17:07:052013年新春福章
日期:2013-04-08 17:42:48奥运纪念徽章
日期:2013-07-18 13:55:12优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11
 楼主| 发表于 2012-6-29 17:21 | 显示全部楼层
本帖最后由 chszs 于 2012-6-29 17:22 编辑

Hibernate 4.1入门指南1 - 使用XML映射文件
一、介绍
Hibernate是一个开源的轻量级ORM框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
1、ORM基本对应规则
        类跟表相对应
        类的属性跟表的字段相对应
        类的实例与表中具体的一条记录相对应
        一个类可以对应多个表,一个表也可以对应对个类
        DB中的表可以没有主键,但是Object中必须设置主键字段
        DB中表与表之间的关系(如:外键)映射成为Object之间的关系
        Object中属性的个数和名称可以和表中定义的字段个数和名称不一样

2、主要的类
SessionFactory (org.hibernate.SessionFactory)
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的(不可变)。 它是生成Session的工厂,本身要用到ConnectionProvider。

Session (org.hibernate.Session)
表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短,隐藏了JDBC连接,也是Transaction的工厂。

Transaction (org.hibernate.Transaction)
应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。

ConnectionProvider (org.hibernate.connection.ConnectionProvider)
生成JDBC连接的工厂(有连接池的作用)。它通过抽象将应用从底层的Datasource或DriverManager隔离开。仅供开发者扩展/实现用,并不暴露给应用程序使用。

TransactionFactory (org.hibernate.TransactionFactory)
生成Transaction对象实例的工厂。仅供开发者扩展/实现用,并不暴露给应用程序使用。

二、准备工作
1、Hibernate
去Hibernate官网下载hibernate-release-4.1.4.Final.zip

2、解压到某目录
这里以${hibernate_home}表示。

3、构建项目
在Eclipse下创建Java项目,名为HiberDemo。
把${hibernate_home}/lib/required下所有JAR包全部添加到项目的ClassPath,把MySQL的JDBC驱动包也添加到项目的ClassPath。

4、项目整体结构
        项目整体结构如图所示:
p1.jpg

三、项目开发

1、数据库及表
在数据库webt4中创建数据表student并插入3条记录:
  1. CREATE TABLE `student` (
  2.   `ID` int(11) NOT NULL AUTO_INCREMENT,
  3.   `NAME` varchar(255) DEFAULT NULL,
  4.   `RECORD` int(11) DEFAULT NULL,
  5.   PRIMARY KEY (`ID`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  7. INSERT INTO student(NAME, RECORD) VALUES("上市", 83);
  8. INSERT INTO student(NAME, RECORD) VALUES("核桃", 99);
  9. INSERT INTO student(NAME, RECORD) VALUES("核桃", 94);
复制代码
2、Hibernate配置文件
在项目的src目录下创建“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. <hibernate-configuration>
  6.     <session-factory>
  7.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  8.         <property name="hibernate.connection.url">jdbc:mysql://10.3.15.78:3306/webt4</property>
  9.         <property name="hibernate.connection.username">webt4</property>
  10.         <property name="connection.password">webt4</property>
  11.         <property name="connection.pool_size">1</property>
  12.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  13.         <property name="show_sql">true</property>
  14.         <mapping resource="ch/hibernate/Student.hbm.xml"/>
  15.     </session-factory>
  16. </hibernate-configuration>

复制代码
3、创建实体类Student.java
  1. package ch.po;

  2. import java.io.Serializable;

  3. public class Student implements Serializable{
  4.         private static final long serialVersionUID = 8072966150998268844L;
  5.         
  6.         private int id;
  7.         private String name;
  8.         private int record;

  9.         public int getId() {
  10.                 return id;
  11.         }

  12.         public void setId(int id) {
  13.                 this.id = id;
  14.         }

  15.         public String getName() {
  16.                 return name;
  17.         }

  18.         public void setName(String name) {
  19.                 this.name = name;
  20.         }

  21.         public int getRecord() {
  22.                 return record;
  23.         }

  24.         public void setRecord(int record) {
  25.                 this.record = record;
  26.         }

  27.         @Override
  28.         public String toString() {
  29.                 return "Student [id=" + id + ", name=" + name + ", record=" + record + "]";
  30.         }

  31. }

复制代码
4、创建映射XML文件Student.hbm.xml
  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

  5. <hibernate-mapping>
  6.         <class name="ch.po.Student" table="student">
  7.                 <id name="id" column="ID" type="java.lang.Integer" />
  8.                 <property name="name" column="NAME" type="java.lang.String" />
  9.                 <property name="record" column="RECORD" type="java.lang.Integer" />
  10.         </class>
  11. </hibernate-mapping>

复制代码
5、创建工具类HibernateUtil.java
  1. package ch.tool;

  2. import org.hibernate.SessionFactory;
  3. import org.hibernate.cfg.Configuration;

  4. @SuppressWarnings("deprecation")
  5. public class HibernateUtil {
  6.         private static final SessionFactory sessionFactory;
  7.         
  8.         static{
  9.                 try{
  10.                         sessionFactory = new Configuration().configure().buildSessionFactory();
  11.                 }catch (Throwable ex) {
  12.                         System.err.println("Initial SessionFactory creation failed." + ex);
  13.                         throw new ExceptionInInitializerError(ex);
  14.                 }
  15.         }
  16.         
  17.         public static SessionFactory getSessionFactory() {
  18.                 return sessionFactory;
  19.         }
  20. }
复制代码
注意:buildSessionFactory()方法已经过时,但是仍然可用。

6、创建访问类StudentDao.java
为了便于运行测试,类中包含main()方法。
  1. package ch.dao;

  2. import java.util.Iterator;
  3. import java.util.List;

  4. import org.hibernate.HibernateException;
  5. import org.hibernate.Session;
  6. import org.hibernate.Transaction;

  7. import ch.po.Student;
  8. import ch.tool.HibernateUtil;

  9. public class StudentDao {

  10.         public static void main(String[] args) {
  11.                 Session session = HibernateUtil.getSessionFactory().openSession();
  12.                 Transaction transaction = null;
  13.                
  14.                 try{
  15.                         transaction = session.beginTransaction();
  16.                         
  17.                         List<Student> students = session.createQuery("from Student").list();
  18.                         for(Iterator<Student> ite = students.iterator(); ite.hasNext();){
  19.                                 Student student = ite.next();
  20.                                 System.out.println(student.toString());
  21.                         }
  22.                         transaction.commit();
  23.                         
  24.                 }catch(HibernateException e){
  25.                         transaction.rollback();
  26.                         e.printStackTrace();
  27.                 } finally{
  28.                         session.close();
  29.                 }

  30.         }
  31. }
复制代码
7、输出
执行程序,输出结果:
  1. ……
  2. INFO: HHH000397: Using ASTQueryTranslatorFactory
  3. Hibernate: select student0_.ID as ID0_, student0_.NAME as NAME0_, student0_.RECORD as RECORD0_ from student student0_
  4. Student [id=1, name=张武, record=83]
  5. Student [id=2, name=上市, record=99]
  6. Student [id=3, name=核桃, record=94]
复制代码

使用道具 举报

回复
论坛徽章:
63
2010广州亚运会纪念徽章:台球
日期:2010-10-18 12:43:48茶鸡蛋
日期:2013-01-09 10:59:002013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:帆船
日期:2013-04-02 17:07:052013年新春福章
日期:2013-04-08 17:42:48奥运纪念徽章
日期:2013-07-18 13:55:12优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11
 楼主| 发表于 2012-6-29 17:25 | 显示全部楼层
Hibernate 4.1入门指南2 - 使用注释
一、准备工作

1、Hibernate
去Hibernate官网下载hibernate-release-4.1.4.Final.zip
2、解压到某目录
这里以${hibernate_home}表示。
3、构建项目
在Eclipse下创建Java项目,名为HiberDemo2。
把${hibernate_home}/lib/required下所有JAR包全部添加到项目的ClassPath,把MySQL的JDBC驱动包也添加到项目的ClassPath。
4、项目整体结构
        项目整体结构如图所示:
p2.jpg

二、项目开发
1、数据库及表

在数据库webt4中创建数据表student。
  1. CREATE TABLE `student` (
  2.   `ID` int(11) NOT NULL AUTO_INCREMENT,
  3.   `NAME` varchar(255) DEFAULT NULL,
  4.   `RECORD` int(11) DEFAULT NULL,
  5.   PRIMARY KEY (`ID`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  7. INSERT INTO student(NAME, RECORD) VALUES("上市", 83);
  8. INSERT INTO student(NAME, RECORD) VALUES("核桃", 99);
  9. INSERT INTO student(NAME, RECORD) VALUES("核桃", 94);
复制代码
2、Hibernate配置文件
在项目的src目录下创建“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. <hibernate-configuration>
  6.     <session-factory>
  7.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  8.         <property name="hibernate.connection.url">jdbc:mysql://10.3.15.78:3306/webt4</property>
  9.         <property name="hibernate.connection.username">webt4</property>
  10.         <property name="connection.password">webt4</property>
  11.         <property name="connection.pool_size">1</property>
  12.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  13.         <property name="show_sql">true</property>
  14.         <mapping class="ch.po.Student"/>
  15.     </session-factory>
  16. </hibernate-configuration>
复制代码
3、创建实体类Student.java
  1. package ch.po;

  2. import java.io.Serializable;

  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.GeneratedValue;
  6. import javax.persistence.Id;
  7. import javax.persistence.Table;

  8. @Entity
  9. @Table(name="student")
  10. public class Student implements Serializable{
  11.         private static final long serialVersionUID = 8072966150998268844L;
  12.        
  13.         @Id
  14.         @GeneratedValue
  15.         private int id;
  16.        
  17.         @Column(name="NAME")
  18.         private String name;
  19.        
  20.         @Column(name="RECORD")
  21.         private int record;
  22.        
  23.         public Student(){
  24.                
  25.         }
  26.        
  27.         public Student(int id, String name, int record) {
  28.                 super();
  29.                 this.id = id;
  30.                 this.name = name;
  31.                 this.record = record;
  32.         }

  33.         public int getId() {
  34.                 return id;
  35.         }

  36.         public void setId(int id) {
  37.                 this.id = id;
  38.         }

  39.         public String getName() {
  40.                 return name;
  41.         }

  42.         public void setName(String name) {
  43.                 this.name = name;
  44.         }

  45.         public int getRecord() {
  46.                 return record;
  47.         }

  48.         public void setRecord(int record) {
  49.                 this.record = record;
  50.         }

  51.         @Override
  52.         public String toString() {
  53.                 return "Student [id=" + id + ", name=" + name + ", record=" + record + "]";
  54.         }

  55. }
复制代码
4、创建工具类HibernateUtil.java
  1. package ch.tool;

  2. import org.hibernate.SessionFactory;
  3. import org.hibernate.cfg.AnnotationConfiguration;

  4. @SuppressWarnings("deprecation")
  5. public class HibernateUtil {
  6.         private static final SessionFactory sessionFactory;
  7.        
  8.         static{
  9.                 try{
  10.                         sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
  11.                 }catch (Throwable ex) {
  12.                         System.err.println("Initial SessionFactory creation failed." + ex);
  13.                         throw new ExceptionInInitializerError(ex);
  14.                 }
  15.         }
  16.        
  17.         public static SessionFactory getSessionFactory() {
  18.                 return sessionFactory;
  19.         }
  20. }
复制代码
注意:buildSessionFactory()方法已经过时,但是仍然可用。

5、创建访问类StudentDao.java
为了便于运行测试,类中包含main()方法。
  1. package ch.dao;

  2. import java.util.Iterator;
  3. import java.util.List;

  4. import org.hibernate.HibernateException;
  5. import org.hibernate.Session;
  6. import org.hibernate.Transaction;

  7. import ch.po.Student;
  8. import ch.tool.HibernateUtil;

  9. public class StudentDao {

  10.         public static void main(String[] args) {
  11.                 Session session = HibernateUtil.getSessionFactory().openSession();
  12.                 Transaction transaction = null;
  13.                
  14.                 try{
  15.                         transaction = session.beginTransaction();
  16.                        
  17.                         List<Student> students = session.createQuery("from Student").list();
  18.                         for(Iterator<Student> ite = students.iterator(); ite.hasNext();){
  19.                                 Student student = ite.next();
  20.                                 System.out.println(student.toString());
  21.                         }
  22.                         transaction.commit();
  23.                        
  24.                 }catch(HibernateException e){
  25.                         transaction.rollback();
  26.                         e.printStackTrace();
  27.                 } finally{
  28.                         session.close();
  29.                 }

  30.         }
  31. }
复制代码
6、输出
执行程序,输出结果:
  1. ……
  2. INFO: HHH000397: Using ASTQueryTranslatorFactory
  3. Hibernate: select student0_.ID as ID0_, student0_.NAME as NAME0_, student0_.RECORD as RECORD0_ from student student0_
  4. Student [id=1, name=张武, record=83]
  5. Student [id=2, name=上市, record=99]
  6. Student [id=3, name=核桃, record=94]
复制代码

使用道具 举报

回复
论坛徽章:
63
2010广州亚运会纪念徽章:台球
日期:2010-10-18 12:43:48茶鸡蛋
日期:2013-01-09 10:59:002013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:帆船
日期:2013-04-02 17:07:052013年新春福章
日期:2013-04-08 17:42:48奥运纪念徽章
日期:2013-07-18 13:55:12优秀写手
日期:2013-12-18 09:29:10马上有车
日期:2014-03-20 16:13:24马上有房
日期:2014-03-20 16:14:11马上有钱
日期:2014-03-20 16:14:11
 楼主| 发表于 2012-6-29 17:26 | 显示全部楼层
三、错误集

1、org.hibernate.InstantiationException: No default constructor for entity: ch.po.Student
原因:实体类中缺少默认的构造方法。
解决:添加一个构造方法即可。
        public Student(){
        }


2、org.hibernate.hql.internal.ast.QuerySyntaxException: student is not mapped [from student]
原因:下面的代码有错误
List<Student> students = session.createQuery("from student").list();
应改为:
List<Student> students = session.createQuery("from Student").list();
createQuery()方法里面的SQL语句参数,from后面跟的并不是表名,而是对应的类名,所以是Student类。

使用道具 举报

回复
认证徽章
论坛徽章:
277
马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11版主9段
日期:2012-11-25 02:21:03ITPUB年度最佳版主
日期:2014-02-19 10:05:27现任管理团队成员
日期:2011-05-07 01:45:08
发表于 2012-6-30 10:47 | 显示全部楼层
非常棒,Hibernate在不断演进中,与之相应的“入门指南”也该随之演进,让初学者可以快速入门。

使用道具 举报

回复
论坛徽章:
20
马上有钱
日期:2014-03-05 18:13:002013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:072012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41迷宫蛋
日期:2011-11-07 14:46:51茶鸡蛋
日期:2011-07-11 20:36:00咸鸭蛋
日期:2011-06-30 15:11:57辩论纪念章
日期:2010-11-15 09:41:552010广州亚运会纪念徽章:网球
日期:2011-05-11 14:11:47
发表于 2012-6-30 10:59 | 显示全部楼层
Come on.

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
10
ITPUB十周年纪念徽章
日期:2011-11-01 16:25:22茶鸡蛋
日期:2013-06-05 12:50:512013年新春福章
日期:2013-05-27 10:23:002013年新春福章
日期:2013-05-27 10:23:002013年新春福章
日期:2013-05-27 10:23:002013年新春福章
日期:2013-02-25 14:51:24茶鸡蛋
日期:2013-02-22 15:45:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:11:482012新春纪念徽章
日期:2012-01-04 11:55:05ITPUB社区千里马徽章
日期:2013-06-09 10:15:34
发表于 2012-7-2 09:48 | 显示全部楼层
Java 的SSH忘得差不多了。奈何毕业没找到开发的工作,倒是干了一份运维的工作。还好java的思想还没忘完。

使用道具 举报

回复
认证徽章
论坛徽章:
104
生肖徽章2007版:猪
日期:2012-07-12 14:24:56菠菜神灯
日期:2013-05-26 22:03:18生肖徽章2007版:猪
日期:2012-07-19 11:10:12生肖徽章2007版:猪
日期:2012-07-19 11:10:12生肖徽章2007版:猪
日期:2012-07-11 19:07:11生肖徽章2007版:猪
日期:2012-07-19 11:10:12生肖徽章2007版:猪
日期:2012-07-19 11:10:12ITPUB伯乐
日期:2012-05-22 15:05:25NBA季后赛纪念徽章
日期:2013-06-21 14:52:05NBA季后赛大富翁
日期:2013-06-21 14:57:11
发表于 2012-7-7 22:05 | 显示全部楼层
不错!

使用道具 举报

回复
论坛徽章:
0
发表于 2012-7-11 22:26 | 显示全部楼层
请问如何把hibernate4.1自带的记录日志的功能给去掉呢

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表