引言:
ORM——对象关系映射,数据库关系模型映射为对象,对象是核心知识。
概述:
hibernate作为ORM思想的一种实现框架,主要体现在它将数据库的关系模型转换为对象进行数据的增删改查操作。学习hibernate,必须要熟悉它的三大对象:Configuration、SessionFactory、Session。
内容:
一 Configuration对象
1 是什么?
org.hibernate.cfg.Configuration的实例,代表了应用程序到SQL数据库的配置信息。
2 做什么?
每个Hibernate配置文件对应一个Configuration对象,负责管理Hibernate的配置信息,Configuration为启动期间对象,其作用为创建SessionFactory实例。当调用:
Configuration cfg = new Configuration().configure
时,Hibernate会自动搜索hibernate.cfg.xml文件,并将其读取到内存中作为后续操作的基础配置。
3 怎么做?
(1)不使用配置文件创建Configuration对象:通过Configuration对象提供的下列方法进行持久化类和设置配置属性。
1)Configuration.addAnnotatedClass(Class annotatedClass):添加一个持久化类;
2)Configuration.addPackage(String packageName):添加指定包下面所有持久化类;
3)Configuration.setProperties(Properties properties):通过Properties实例设置属性;
4)Configuration.setProperty(String propertyName,String value):设置单个属性。
// 实例化Configuration,不加载任何配置文件
Configuration conf = new Configuration()
// 通过addAnnotatedClass()方法添加持久化类
.addAnnotatedClass(org.crazyit.app.domain.News.class)
// 通过setProperty设置Hibernate的连接属性。
.setProperty("hibernate.connection.driver_class"
, "com.mysql.jdbc.Driver")
.setProperty("hibernate.connection.url"
, "jdbc:mysql://localhost/hibernate")
.setProperty("hibernate.connection.username" , "root")
.setProperty("hibernate.connection.password" , "liming")
.setProperty("hibernate.c3p0.max_size" , "20")
.setProperty("hibernate.c3p0.min_size" , "1")
.setProperty("hibernate.c3p0.timeout" , "5000")
.setProperty("hibernate.c3p0.max_statements" , "100")
.setProperty("hibernate.c3p0.idle_test_period" , "3000")
.setProperty("hibernate.c3p0.acquire_increment" , "2")
.setProperty("hibernate.c3p0.validate" , "true")
.setProperty("hibernate.dialect"
, "org.hibernate.dialect.MySQL5InnoDBDialect")
.setProperty("hibernate.hbm2ddl.auto" , "update");
// 以Configuration实例创建SessionFactory实例
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
SessionFactory sf = conf.buildSessionFactory(serviceRegistry);
(2)使用hibernate.properties作为配置文件:hibernate.properties配置文件没有提供添加Hibernate持久化类的方式,必须调用Configuration对象的addAnnotatedClass()或addPackage()方法添加持久化类。
Configuration cfg = new Configuration().configure().addAnnotatedClass(com.hibernate.demo.domain.News.class);
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
sessionFactory = cfg.buildSessionFactory(serviceRegistry);
(3)使用hibernate.cfg.xml作为配置文件
Configuration cfg = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = cfg.buildSessionFactory();
二 SessionFactory对象
1 是什么?
简单理解SessionFactory是用来创建session会话的工厂,广义上是初始化Hibernate的接口。一个项目通常只需要定义一个SessionFactory就够,当项目中出现多个数据库时,可以为每一个数据库指定一个SessionFactory。
2 做什么?
充当数据存储源的代理,并负责创建Session对象,管理所有session对象。
3 怎么做?
(1)openSession:每次都是新的,需要close
(2)getCurrentSession:从上下文找,如果有,用旧的,如果没有,新创建一个Session。
1)用途,界定事务边界
2)事务提交自动close
3)跟current_session_context_class(JTA、thread)有关系
注意:当前session运行的上下文,在hibernate.cfg.xml里指定的:最常用的就是thread,看当前的线程里有没有session对象,有了就获取旧的session,没有就创建新的session。
<property name="current_session_context_class">thread</property>
三 Session
1 是什么?
表示应用程序和数据库的一次会话,也可以理解为一次数据库操作。
2 做什么?
提供对映射的实体类实例的创建、读取和删除操作,通过session自带的一些方法改变实例对象的状态
3 怎么做?
总结:
hibernate4除了三大对象还引入一个新的对象ServiceRegistry,这也是hibernate4的新特性。顾名思义,ServiceRegistry是Service的注册表,它为Service提供了一个统一的加载/初始化/存放/获取机制,作为独立组件,具有注册表和存储库的功能,比较全面,适用于XML模式。hibernate核心还是对象和数据库关系的映射,通过操作java对象来操作数据,更加符合面向对象的思想。