初始Hibernate-配置、映射篇

1.Hibernate配置文件
 
  

hibernate.cfg.xml。该配置文件应该放在项目的src根目录下。其配置如下

	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">



	
		
		com.mysql.jdbc.Driver
		
		jdbc:mysql://localhost:3306/UH
		
		root
		
		123456
		
		org.hibernate.dialect.MySQLDialect
		
		true
		
		
		
	

其中常用的配置属性有

1.1 connection.driver_class

该属性指定连接数据库的驱动,不过要注意版本的问题。

在Oracle中常为oracle.jdbc.driver.OracleDiver。其缺省端口通常1521。

在mysql数据库中,常为com.mysql.jdbc.Driver,其缺省端口通常为3306.。

1.2 connection.url

该属性为设置数据库的URL地址

在Oracle中其形式通常为 jdbc:oracle:thin:@dbip:port:databasename,dbip –为数据库服务器的IP地址,如果是本地可写:localhost或127.0.0.1。port –为数据库的监听端口,需要看安装时的配置,缺省为1521。databasename –为数据库的SID,通常为全局数据库的名字。

在MySQL中其形式通常为jdbc:mysql://dbip:port/databasename,dbip –为数据库服务器的IP地址,如果是本地可写:localhost或127.0.0.1。port –为数据库的监听端口,需要看安装时的配置,缺省为3306。databasename –为数据库的SID,通常为全局数据库的名字。

1.3 connection.username 和 connection.password

分别为设置连接数据库的用户名和密码。

1.4 dialect

dialect属性为设置数据库的方言类型,由于目前有各种各样开发数据库管理软件的公司,为了提高自己数据库的性能或者增加一些功能都采用了一套额外的标准语法。像Oracle, MySQL, MS SQL Server等。

1.5 show_sql

是否在控制台打印SQL语句,通常我们会设置为true,这样方便开发和维护人员了解数据库内部的运行动态。

1.6 format_sql

是否格式化SQL语句,这个属性的设置会挺高代码的可读性。

1.7 hbm2ddl.auto

设置是否自动生成数据库表,其实这个hibernate.hbm2ddl.auto参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none"。
create:
每次加载hibernate时都会删除上一次的生成的表,然后根据你的model类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop :
每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除。
update:
最常用的属性,第一次加载hibernate时根据model类会自动建立起表的结构(前提是先建立好数据库),以后加载hibernate时根据 model类自动更新表结构,即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等 应用第一次运行起来后才会。
validate :
每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

再说点“废话”:
当我们把hibernate.hbm2ddl.auto=create时hibernate先用hbm2ddl来生成数据库schema。
当我们把hibernate.cfg.xml文件中hbm2ddl属性注释掉,这样我们就取消了在启动时用hbm2ddl来生成数据库schema。通常 只有在不断重复进行单元测试的时候才需要打开它,但再次运行hbm2ddl会把你保存的一切都删除掉(drop)---- create配置的含义是:“在创建SessionFactory的时候,从scema中drop掉所以的表,再重新创建它们”。
注意,很多Hibernate新手在这一步会失败,我们不时看到关于Table not found错误信息的提问。但是,只要你根据上面描述的步骤来执行,就不会有这个问题,因为hbm2ddl会在第一次运行的时候创建数据库schema, 后续的应用程序重启后还能继续使用这个schema。假若你修改了映射,或者修改了数据库schema,你必须把hbm2ddl重新打开一次。

2 编写持久化类

在Hibernate中持久化类是Hibernate操作对象,也是通过对象-关系映射(ORM)后所映射的实体类,用来描述数据库表的结构信息。持久化类中的属性应该与数据库表中的字段想匹配。

package hibernate;

public class User {
	private Integer id;
	private String name;
	private String password;
	public User(){}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
        ..... //省略一些getter和setter方法。
}
我们要注意在编写持久化类的时候要加上无参数构造方法,和实现getter和setter方法。还有类中要有一个标识属性像本类中的id。属性的域应为private。

3 Hibernate映射

Hibernate 的核心就是对象关系的映射,对象和关系数据库的映射通常是用XML文档来实现的。映射文件的命名规则为*.hbm.xml。



 
 
 	
 	
 		
 	
 	
 	
 		
 	
 	
 		
 	
 	
 

映射语言是以Java为中心的,所以在映射文档是按照持久化类型定义创建的,而不是数据表的的定义。
在class元素中包含一个元素和多个元素,用于表示持久化类的唯一标识与数据库主键字段的映射。元素定义主键的生成策略。用于持久化类的其他属性和数据表中非主键字段的映射。

name 持久化类属性的名称,以小写字母开头
column 数据库字段名
type 数据库字段类型
length 数据库字段定义的长度
not-null 该数据库字段是否可以为空,该属性为bool变量
unique 该数据库字段是否唯一,该属性为bool变量
lazy 是否延迟抓取,该属性为bool变量

如果在映射文件中没有配置column和type属性,Hibernate将会默认使用持久化类中的属性名称和属性类型匹配数据表中的字段。
在你已经创建好表时且指定主键再使用会报错,主键的一些使用策略如下:

increment 用于Long、Short或者Int类型生成唯一的标识。在集群下不要使用该属性
identity 由于由底层数据库生成主键,前提是底层数据库支持自增字段类型
sequence 根据底层数据库的序列生成的主键,前提是底层数据库支持序列
hilo 根据高/低算法生成,把特定表的字段作为高位值来源,在默认情况下选用hibernate_unique_key表的next_hi字段
native 根据底层数据库自动生成标识的支持能力选择identity、sequence或hilo
assigned  由程序负责主键的生成,此时持久化类的唯一标识不能声明为private
foreign 使用另一个相关联的对象的标识符,通常和一起使用

4 Hibernate初始化类

Session对象是HIbernate中数据持久化的核心,他负责Hibernate所有持久化的操作。
在4.0版本以下的Hibernate的SessionFactory的创建代码如下:

Configuration cfg = new Configuration().configue();  //加载hibernate的配置文件
factory = cfg.buildSessionFactory();	//实例化SessionFactory

在4.0版本以上的Hibernate, 确切的说是4.3版本以上,其中间又使用新的创建方法,但又废除了:

Configuration cfg = new Configuration().configure();
			ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(cfg.getProperties());
			ServiceRegistry sr = srb.buildServiceRegistry();
			sessionFactory = cfg.buildSessionFactory(sr);


类HibernateUtil如下:

package hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;

public class HibernateUtil {
	
	private static final ThreadLocal threadLocal = new ThreadLocal(); 
	private static SessionFactory sessionFactory = null;
	
	static {
		try {
			Configuration cfg = new Configuration().configure();
			ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(cfg.getProperties());
			ServiceRegistry sr = srb.buildServiceRegistry();
			sessionFactory = cfg.buildSessionFactory(sr);
			
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	//获取session
	public static Session getSession() throws HibernateException {
		Session session = (Session) threadLocal.get();
		if (session == null || !session.isOpen()) {
			if (sessionFactory == null) {
				//TODO
				rebuildSessionFactory();
			}
			session = (sessionFactory != null) ? sessionFactory.openSession():null;
			threadLocal.set(session);
		}
		return session;
	}
	
	public static void rebuildSessionFactory() {
		try {
			Configuration cfg = new Configuration().configure();
			ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(cfg.getProperties());
			ServiceRegistry sr = srb.buildServiceRegistry();
			sessionFactory = cfg.buildSessionFactory(sr);
			
			
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	//close session
	public static void closeSession() throws HibernateException {
		Session session = (Session) threadLocal.get();
		threadLocal.set(null);
		if (session != null){
			session.close();
		}
	}
}

一个添加User的实例:
package hibernate;

import org.hibernate.Session;

public class AddUser {
	private Session session = null;
	private User user = new User();
	
	public void addUser(int id, String name, String password){
		user.setId(id);
		user.setName(name);
		user.setPassword(password);
		
		//Hibernate持久化操作
		try{
			session = (Session) HibernateUtil.getSession();
			session.beginTransaction();
			session.save(user);
			session.getTransaction().commit();
			
		}catch (Exception e) {
			// TODO: handle exception
			session.getTransaction().rollback();
			e.printStackTrace();
		}finally{
			HibernateUtil.closeSession();
		}
	}
	public static void main(String[] args){
		AddUser opt = new AddUser();
		//opt.addUser(1234, "xiaohuang", "123456");
		opt.addUser(1235, "xiaocheng", "123456");
	}
}
运行效果:
初始Hibernate-配置、映射篇_第1张图片

你可能感兴趣的:(Hibernate)