Hibernate - 基础入门详解

【1】什么是Hibernate

一个框架,一个Java领域的持久化框架,一个ORM框架。

① 什么是对象的持久化

  • 狭义的理解,“持久化”仅仅指把对象永久保存到数据库中。
  • 广义的理解,“持久化”包括和数据库相关的各种操作:
    • 保存:把对象永久保存到数据库中。
    • 更新:更新数据库中对象(记录)的状态。
    • 删除:从数据库中删除一个对象。
    • 查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。
    • 加载:根据特定的OID,把一个对象从数据库加载到内存中。

什么是OID?
为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数据库中称之为主键,而在对象术语中,则叫做对象标识(Object identifier-OID)。


② 什么是ORM

ORM(Object Relation Mapping): 对象关系映射。

ORM 框架主要解决对象-关系的映射:

Hibernate - 基础入门详解_第1张图片

ORM的思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。

ORM 采用元数据来描述对象-关系映射细节, 元数据通常采用 XML 格式, 并且存放在专门的对象-关系映射文件中。

Hibernate - 基础入门详解_第2张图片


其他ORM框架还有MyBatis、TopLink(EclipseLink)以及OJB等。

  • Hibernate:

    • 非常优秀、成熟的 ORM 框架。
    • 完成对象的持久化操作
    • Hibernate 允许开发者采用面向对象的方式来操作关系数据库。
    • 消除那些针对特定数据库厂商的 SQL 代码
  • MyBatis:

    • 相比 Hibernate 灵活高,运行速度快;
    • 开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语句,并且熟练使用sql语句优化功能 。

【2】Hibernate环境配置

① eclipse下hibernatetools安装

为了方便使用Hibernate,你可能需要在eclipse里面安装一个hibernatetools。

如下图所示,你可以在Eclipse Marketplace中安装JBoss Tools 时,单独选择hibernate tools 进行安装:

Hibernate - 基础入门详解_第3张图片

安装好后效果如下图:

Hibernate - 基础入门详解_第4张图片


② pom文件

这里Spring和Hibernate版本用的都是5.X。

完整pom文件如下所示:


  4.0.0
  com.jane
  hibernate
  war
  0.0.1-SNAPSHOT
  hibernate Maven Webapp
  http://maven.apache.org
  
   
		UTF-8
		1.8  
		5.0.2.RELEASE
		5.2.10.Final
  		5.4.0.Final
		4.11
		3.1.0
		2.5
		2.3.1
		1.2
		5.1.40
		1.1.10
		1.2.33
		1.3.1
		1.7.21
		1.7.25
		1.2.17
		4.11
		2.9.0
		1.7.1
	

	
			
		
			org.springframework
			spring-jms
			${spring.version}
		
		
			org.springframework
			spring-core
			${spring.version}
		
		
			org.springframework
			spring-tx
			${spring.version}
		
		
			org.springframework
			spring-beans
			${spring.version}
		
		
			org.springframework
			spring-context
			${spring.version}
		
		
			org.springframework
			spring-context-support
			${spring.version}
		
		
			org.springframework
			spring-web
			${spring.version}
		
		
			org.springframework
			spring-webmvc
			${spring.version}
		
		
			org.springframework
			spring-aop
			${spring.version}
		
		
			org.springframework
			spring-aspects
			${spring.version}
		
		
			org.springframework
			spring-jdbc
			${spring.version}
		

		
			org.aspectj
			aspectjweaver
			${aspectj.version}
		
		
		
			    
			org.hibernate	    
			hibernate-core	    
			${hibernate.version}	
				 
		          
			org.hibernate          
			hibernate-validator          
			${hibernate.validator.version}      
		            
		            
			org.hibernate            
			hibernate-entitymanager            
			${hibernate.version}      
		
		
		
		
			javax.servlet
			javax.servlet-api
			${servlet.version}
		
		
			javax.servlet
			servlet-api
			${servlet.api.version}
		
		
			javax.servlet.jsp
			javax.servlet.jsp-api
			${jsp-api.version}
		
		
			javax.servlet
			jstl
			${jstl.version}
		

		
		
			mysql
			mysql-connector-java
			${mysql.driver.version}
		
		
		
		
			com.alibaba
			druid
			${alibaba.druid.version}
		

		
		
			com.alibaba
			fastjson
			${alibaba.fastjson.version}
		

		
		
			commons-fileupload
			commons-fileupload
			${commons-fileupload.version}
		

		
		
		
		
			log4j
			log4j
			${log4j.version}
		
		
		    org.slf4j
		    slf4j-api
			${slf4j.api.version}
		
		
			org.slf4j
			slf4j-log4j12
			${slf4j.version}
		
		
		
		
			junit
			junit
			${junit.version}
			provided
		
		
	
  
    hibernate
  



【3】Hibernate的HelloWorld

Hibernate开发步骤如下:

  • 环境配置;
  • 配置hibernate.cfg.xml;
  • 创建persistent objects;
  • 配置*.hbm.xml–对象关系映射文件;
  • 通过 Hibernate API 编写访问数据库的代码。

hibernate.cfg.xml配置如下:




    
    	
		root
		123456
		com.mysql.jdbc.Driver
		jdbc:mysql:///test
		
		
		
		
		org.hibernate.dialect.MySQL5InnoDBDialect		
		
		
		true
	
		
		true
	
		
		update
		
		
		
    


实例类如下:

Hibernate 不要求持久化类继承任何父类或实现接口,这可以保证代码不被污染。这就是Hibernate被称为低侵入式设计的原因。

public class News {
	
	private Integer id; //field
	private String title;
	private String author;
	
	private String describle;
	
	private Date date;
	
	//使用 title + "," + content 可以来描述当前的 News 记录. 
	//即 title + "," + content 可以作为 News 的 describle 属性值
	
	private String content;
	
	private Blob picture;
	
	public Blob getPicture() {
		return picture;
	}

	public void setPicture(Blob picture) {
		this.picture = picture;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
	

	public Integer getId() { //property
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}
	
	public String getDescrible() {
		return describle;
	}
	public void setDescrible(String describle) {
		this.describle = describle;
	}
	
	public News(String title, String author, String describle, Date date, String content, Blob picture) {
		super();
		this.title = title;
		this.author = author;
		this.describle = describle;
		this.date = date;
		this.content = content;
		this.picture = picture;
	}

	public News() {
		// TODO Auto-generated constructor stub
	}

	@Override
	public String toString() {
		return "News [id=" + id + ", title=" + title + ", author=" + author + ", describle=" + describle + ", date=" + date
				+ ", content=" + content + ", picture=" + picture + "]";
	}
	
}

Note :

  • 提供一个无参的构造器:使Hibernate可以使用Constructor.newInstance() 来实例化持久化类;
  • 提供一个标识属性(identifier property): 通常映射为数据库表的主键字段. 如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate();
  • 为类的持久化类字段声明访问方法(get/set): Hibernate对JavaBeans 风格的属性实行持久化;
  • 使用非 final 类: 在运行时生成代理是 Hibernate 的一个重要的功能. 如果持久化类没有实现任何接口, Hibnernate 使用 CGLIB 生成代理. 如果使用的是 final 类, 则无法生成 CGLIB 代理;
  • 重写 eqauls 和 hashCode 方法: 如果需要把持久化类的实例放到 Set 中(当需要进行关联映射时), 则应该重写这两个方法。

根据实力类使用HibernateTools插件创建的News.hbm.xml如下:

Hibernate 采用 XML 格式的文件来指定对象和关系数据之间的映射. 在运行时 Hibernate 将根据这个映射文件来生成各种 SQL 语句。




    
        
            
            
            

        
        
            
        
        
            
        
        
            
        
        
            
        
        
            
        
        
            
        
    

这里需要注意ID-generator,其选项如下:

Hibernate - 基础入门详解_第5张图片


测试类如下:

import java.sql.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.jane.model.News;

public class HibernateTest {

	@Test
	public void test() {
		
		System.out.println("test...");
		
		//1. 创建一个 SessionFactory 对象
		SessionFactory sessionFactory = null;
		
		StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().configure().build();
		sessionFactory = new MetadataSources(ssr).buildMetadata().buildSessionFactory();
		
		//5. 创建一个 Session 对象
		Session session = sessionFactory.openSession();
		
		//6. 开启事务
		Transaction transaction = session.beginTransaction();
		
		//7. 执行保存操作
		News news =new News("hibernate", "jane", "orm", new Date(new java.util.Date().getTime()), null, null);
		System.out.println(news);
		session.save(news);
		
		//8. 提交事务 
		transaction.commit();
		
		//9. 关闭 Session
		session.close();
		
		//10. 关闭 SessionFactory 对象
		sessionFactory.close();
	}
	
}

这里需要注意一个问题,你获取SessionFactory的方式和你的Hibernate有关!

//创建 Configuration 对象: 对应 hibernate 的基本配置信息和 对象关系映射信息
Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
		
//4.0 之前这样创建
sessionFactory = configuration.buildSessionFactory();

//4.X你可能这样创建

// 创建一个 ServiceRegistry 对象: hibernate 4.x 新添加的对象
//hibernate 的任何配置和服务都需要在该对象中注册后才能有效.
ServiceRegistry serviceRegistry = 
new ServiceRegistryBuilder().applySettings(configuration.getProperties()) .buildServiceRegistry();

//或者这样创建一个 ServiceRegistry 对象
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();

//创建一个 SessionFactory 对象
sessionFactory = configuration.buildSessionFactory(serviceRegistry);

但是5.X中上面示例都过时,请使用如下方式获取SessionFactory:

public class HibernateUtils {
	private static SessionFactory sessionFactory;
	private static SessionFactory buildSessionFactory(){
		StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().configure().build();
		sessionFactory = new MetadataSources(ssr).buildMetadata().buildSessionFactory();
		return sessionFactory;
	}
	public static SessionFactory getSessionFactory(){
		return (sessionFactory==null ? buildSessionFactory() : sessionFactory);
	}
	public static Session openSession(){
		return getSessionFactory().openSession();
	}
}

否则你很可能遇到一个org.hibernate.MappingException:Unknown entity异常!

Hibernate项目下载地址:Git-Hub地址。

你可能感兴趣的:(Hibernate)