您的位置:首页 > 其它

Hibernate基础之实体类对象和一级缓存

2018-02-13 15:52 246 查看
实体类对象状态
        1、实体类状态有三种,分别是瞬间态,持久态,托管态

                    (1)瞬间态:对象里没有id值,对象与session没有关联(大概是指不是从session中取出来的,自己新建的);

                    (2)持久态:对象里有id值,对象与session也有关联(通过session类的get()方法刚出来的就是一种);

                    (3)托管态:对象里有id值,对象与session没有关联(session类中取出,但是修改相关属性了)。

         2、操作实体类对象的另一个方法:session类的saveOrUpdate()方法
               实体类对象没有id值,为瞬间态的时候,则为添加,save操作;

                实体类对象有id值,为托管态,或持久态是,都为修改,update操作。

Hibernate中的一级缓存
            缓存:数据存在数据库里,数据库本身是文件系统,使用流方式操作文件的效率不是很高

                       因此,将数据存到内存里面,不需要使用流方式,就可以直接读取内存中的数据,提高了读取的效率。

            hibernate的缓存

                 (1)hibernate框架中提供了很多的优化方式,hibernate的缓存就是一个优化方式;

                (2)hibernate缓存的特点:有一级二级缓存
                                一级缓存默认是打开的

                                hibernate的一级缓存存在使用范围,是session的范围:从session的创建到session的close()关闭;

                                 hibernate的一级缓存中存储的数据必须是持久态数据;

                          二级缓存:目前已经不使用(替代技术是redis),默认是不打开的,使用范围是整个项目的范围,SessionFactory的范围。

                验证一级缓存的存在,分别从数据库中取两次对象,发现两次对象的内存地址指向同一个,并且从控制台中可以看到只有在第一次读取对象的时候hibernate才会想数据库发送sql语句。

                   一级缓存的工作原理:当执行查询操作时,hibernate首先到一级缓存中查找相关对象是否存在,没有时,才会向数据库发送sql语句来查询数据;返回对象之后,该对象为持久化对象,hibernate会将此对象放入一级缓存中。第二次读取时,依然先到一级缓存中查找相关的对象,有相应对象则直接返回该对象。

                    一级缓存的特性:一级缓存中的持久化数据会自动向数据库更新(持久态的对象不需要session类的save或者update命令即可以向数据库更新);
                        执行过程:
                                (1)SessionFactory.openSession()时候,就开始开辟一级缓存,同时也建立了与一级缓存相对应的快照区(副本);
                                 (2)session的get()方法之后,hibernate就将返回的持久态的对象放到一级缓存区中,同时也在快照区中建立副本;
                                 (3)setter了对象的属性之后,也即修改了持久态对象的值,同时修改了一级缓存中的内同,但是不会修改一级缓存对应快照区中的内容;

                                  (4)transaction.commit(),事务提交时,做了如下动作,比较一级缓存和相对应的快照区中的内容是否相同,如不相同,就将相关内容更新到数据库中,若相同,则不操作数据库。(提高性能)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate初学