精通Hibernate:通过Hibernate操纵对象

一、Java对象在JVM中的生命周期

当应用程序通过new语句创建一个Java对象时,JVM会为这个对象分配一个内存空间,只要这个对象被引用变量引用,它就一直处在内存中。但是如果这个对象不被任何引用变量引用,它就结束生命周期,此时JVM的垃圾回收器会在适当的时候回收它占用的内存。

二、理解Session的缓存

如果希望一个Java对象A一直处于生命周期中,就必须保证至少有一个对象保持对它的引用或者可以从其他处于生命周期中的对象B导航到这个对象A,比如在对象B的Java组合中存放了对象A的引用。在Session接口的实现中包含一系列的Java集合,这些Java集合构成了Session缓存。如下图所示:

精通Hibernate:通过Hibernate操纵对象

当Session的save()方法持久化一个Customer对象时,Customer对象就被加入到Session缓存中,以后即使不被调用,只要Session缓存没有清空,Customer对象就仍然处在生命周期。

当Session的get()方法试图从数据库中加载一个Customer对象时,Session先判断缓存中是否已经存在这个Customer对象,如果存在,就不需要再到数据库中检索,而直接存缓存中获得这个Customer对象。

◆  Session缓存的三大作用

(1)减少访问数据库的频率;

(2)当缓存中的持久化对象之间存在循环关联关系时,Session会保证不会出现访问对象图的死循环以及由死循环引起的JVM堆栈溢出异常;

(3)保证数据库中的相关记录与缓存中的相应对象保持同步。

◆ 脏检查以及清理缓存的机制

当一个Customer对象被加入到Session中时,Session会为其做一个快照。当Session执行清理缓存时,它会将Customer当前属性和快照进行比较,如果发生变化,就称这个对象为“脏对象”,Session会根据对象的最新属性来执行相关的SQL语句,从而同步更新数据库。这即是Session缓存三大作用の第三个。

当Session缓存中对象的属性发生变化时,Session并不会立即清理缓存执行相关SQL语句,而是在特定的时间点才会清理缓存,这使得Session能够把几条相关的SQL语句合并成一条SQL语句,以便减少访问数据库的次数,从而提高性能。

精通Hibernate:通过Hibernate操纵对象

精通Hibernate:通过Hibernate操纵对象

三、Java对象在Hibernate持久化层的状态

精通Hibernate:通过Hibernate操纵对象

精通Hibernate:通过Hibernate操纵对象

精通Hibernate:通过Hibernate操纵对象

四、Session接口的详细用法

精通Hibernate:通过Hibernate操纵对象

public static void main(String[] args) throws Exception    



19.    {    




20.        //实例化Configuration     




21.        Configuration conf = new Configuration().configure();    




22.        //实例化SessionFactory     




23.        SessionFactory sf = conf.buildSessionFactory();    




24.        //实例化Session     




25.        Session sess = sf.openSession();    




26.        //开始事务     




27.        Transaction tx = sess.beginTransaction();    




28.        //创建消息实例     




29.        News n = new News();    




30.        //设置消息标题和消息内容     




31.        n.setTitle("疯狂Java联盟成立了");    




32.        n.setContent("疯狂Java联盟成立了,网址是www.crazyit.org");    




33.        //保存消息     




34.        sess.save(n);    




35.        //提交事务     




36.        tx.commit();    




37.        //关闭Session     




38.        sess.close();    




39.    }   

1、Configuration类

精通Hibernate:通过Hibernate操纵对象

2、SessionFactory接口

精通Hibernate:通过Hibernate操纵对象

使用SessionFactory对象可以获取Session对象。

3、Session(会话)接口

Session接口是Hibernate中的核心接口,它不是Java Web应用中HttpSession接口。Hibernate操作数据库之前必须先获取一个Session对象,相当于JDBC在操作数据库之前必须获取一个Connection对象一样。

精通Hibernate:通过Hibernate操纵对象

//也可以使用Session session=session.openSession()方法

获取Session对象后,Hibernate内部并不会获取操作数据库的java.sql.Connection对象,而是等待Session对象真正需要对数据库进行CRUD等操作时,才会从数据库连接池中获取java.sql.Connection对象。而关闭Session对象时,则是将java.sql.Connection对象返回到连接池中,而不是直接关闭java.sql.Connection对象。

1)save()方法

save()方法是用来保存持久化对象,进而在数据库中新增一条数据的方法;执行save()方法之后不会立即操作数据库来进行保存数据,而是在Transaction对象的commit()方法执行之后才会保存数据。

import org.hibernate.Session;  



import org.hibernate.SessionFactory;  




import org.hibernate.Transaction;  




import org.hibernate.cfg.Configuration;  




import java.util.Date;  



 



public class HibernateTest {  




    public static void main(String[] args) {  




        Configuration config = new Configuration();  



        config.configure();  


        SessionFactory sessionFactory = config.buildSessionFactory();  


        Session session = sessionFactory.getCurrentSession();  


        Transaction tx = session.beginTransaction();  


 



        Guestbook gb = new Guestbook();  




        gb.setName("刘伟");  




        gb.setPhone("01082622285");  




        gb.setEmail("[email protected]");  




        gb.setTitle("大家好");  




        gb.setContent("欢迎大家学习Hibernate技术。");  




        gb.setCreatedTime(new Date());  



 


        session.save(gb);  


        tx.commit();  


        sessionFactory.close();  


    }  


} 

2)get()/load()方法

通过Session对象的get()方法可以获取数据库中的一条记录,如:

Guestbook gb=(Guestbook) session.get(Guestbook.class,new Integer(1));//查找Guestbook中id为1的记录 

get()方法的第一个参数是持久化对象,第二个参数是要查找的持久化对象的标识符属性值。

通过Session对象的load()方法可以获取数据库中的一条记录,如:

Guestbook gb=(Guestbook) session.load(Guestbook.class,new Integer(1));//查找Guestbook中id为1的记录 

两者之间的区别:load()和get()在未找到符合条件的持久化对象的时候,load()会抛出一个违例,而get()方法返回null。另外两者对缓存对象的读取也不同,load()方法会先从Hibernate的一级缓存中去查找符合条件的对象,找不到的话则会去Hibernate的二级缓存中去查找对象,仍未找到的话才会去数据库中去查找;但是get()方法不会去查找Hibernate的二级缓存。

3)update()方法

精通Hibernate:通过Hibernate操纵对象

4)delete()方法

精通Hibernate:通过Hibernate操纵对象

4、Transaction(事务)接口

精通Hibernate:通过Hibernate操纵对象

5、Query接口

精通Hibernate:通过Hibernate操纵对象

6、Criteria接口

相关推荐