在前面的例子中,我们经常看到这样的代码:
public class TeacherTest {
private static SessionFactory sf=null;
@BeforeClass
public static void beforeClass(){
//读取配置 文件 hibernate.cfg.xml
Configuration cf= new Configuration().configure();
sf=cf.buildSessionFactory();
}
@Test
public void testSaveTeacher() {
//获取 Session
Session session=sf.openSession();
//开启事务
session.beginTransaction();
Teacher t=new Teacher();
t.setId(2);
t.setName("zhangsan");
t.setTitle("professior");
//对持久化对象 进行 增删改查 操作
session.save(t);
session.getTransaction().commit();
session.close();
}
@AfterClass
public static void afterClass(){
sf.close();
}
}
代码中有Configuration、SessionFactory、Session、Transaction等的应用。就是由他们构成了Hibernate的核心,即有了他们,我们才不需要操作那些复杂的SQL数据库语句。而是通过他们来帮助我们完成对象的持久化操作。
Hibernate核心如下图所示
Hibernate 核心有2个配置文件和4大接口构成。
下面对这些接口和配置文件做一个简单的介绍
1、Configuration:用于启动和配置Hibernate。
说的更加详细点,Configuration有以下几点作用:1)进行配置信息的管理 2)用其buildSessionFactory()方法来产生SessionFactory 3)可以在configure方法中指定hibernate配置文件,默认情况下是读取hibernate.cfg.xml,如果我们的配置文件不叫这个名字,则需要将这个配置文件传入到这个configure(”XXX.cfg.xml”)。
2、SessionFactory:用于初始化Hibernate。维护着数据库的连接池,当产生一个Session时,就分配一个数据库的连接给它。
SessionFactory有如下两种方法获取Session对象。
Session session=sessionFactory.openSession();
这种方法每次都是打开一个新 Session。因此需要手动 session.close();
而还有一种方法:
Session session=sessionFactory.getCurrentSession();
此种方法并不是每次都是获取一个新Session,而是从上下文找,如果存在Session,则就用旧的session,否则获取一个新的Session。这种方法的用途:界定事务边界。当事务提交时自动close。
使用getCurrentSession()从上下文来找,因此,在hibernate.cfg.xml中要设置这样一行代码:
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
current_session_context_class的取值还可以去jta、manager等,其中jta从分布式来建立Session,即用于多个数据库来处理事务。
3、Session:用于持久化对象的CURD(即增删改查)操作。
主要的方法有:1)save() delete() update() load get等方法。想查看更多的方法,可以查看Hibernate的API.
关于Session,不得不介绍对象的3种状态transient、persistent、detached。
这三种状态的主要区别在于:1)有没有ID,2)ID在数据库中有没有 3)在内存中有没有(session 缓存)
1、transient:内存中有一个对象,没有ID,缓存中也没有ID
2、persistent:内存中有,缓存中也有,数据库中也有(ID)
3、detached:内存中有,缓存中没有,数据库中有。
三种状态更具Session调用不同的方法的状态转化图如下(图片来源于马士兵Hibernate视频):
4、Transaction:用于操作事务。
5、hibernate.cfg.xml:用于存放配置数据库连接相关的信息,例如:使用的驱动、方言等
6、XXX.hbm.xml:是一个映射文件,用于实体类和数据库表之间进行映射。
1、马士兵《Hibernate视频讲解》