Hibernate (四)基本特性

    xiaoxiao2021-03-26  6

    一、对象持久性

    在Hibernate使用过程中,实体对象可以具有以下三种状态: 1)临时状态:采用new关键字创建的对象,该对象未与Session发生关联(未调用Session的API)。也叫临时对象。临时状态的对象会被Java的垃圾回收机制回收。 2)持久状态:实体对象与Session发生关联(调用了Session的get、load、save、update等API)。也叫持久对象。 3)游离状态:原来是持久状态,后来脱离了Session的管理。如:Session被关闭,对象将从持久状态变为游离状态,同时垃圾回收机制可以回收掉,不再占用缓存空间了。

    二、处于持久状态的对象具有的特点

    1)对象生命期持久,垃圾回收机制不能回收。 2)对象的数据可以与数据库同步(即对象中的数据发生改变,则数据库中的数据自动同步)。由Session对象负责管理和同步。 3)对象在Session的一级缓存中存放(或者说在Session缓存中的对象都是持久对象)。

    注意事项:Session.close();有两个作用:①关闭连接、释放资源②使对象变为游离状态,当对象的引用不存在时,对象才被回收。没被回收时,对象中的数据还在!

    三、三种状态下的对象的转换

    当持久对象数据改变后,调用session.flush()方法,会与数据库同步更新。

    commit()方法,内部也调用了flush()方法,因此使用commit()方法可以省略flush()方法的调用。

    四、一级缓存机制(默认开启)

        一级缓存被称为Session级别的缓存:每个Session都有自己独立的缓存区,该缓存区随着Session创建而开辟(由SessionFactory创建),随着Session.close()而释放。 该缓存区可以存储当前Session关联的持久对象。只有在缓存区中,Session才管该对象。

        一级缓存的好处:

        Hibernate在查询时,先去缓存当中查找,如果缓存中没有,才去数据库查询。如果利用Session对同一个对象查询多次,第一次去数据库查,后续的会从缓存查询,从而减少了与数据库的交互次数。

        一级缓存的管理方法

        1)session.evict()方法:将对象清除。     2)session.clear()方法:清除所有对象。     3)session.close()方法:清除所有对象,并关闭与数据库的连接。

    五、延迟加载机制

        Hibernate在使用时,有些API操作是具有延迟加载机制的。延迟加载机制的特点:当通过Hibernate的API获取一个对象结果后,该对象并没有数据库数据。当通过对象的getter方法获取属性值时,才去数据库查询加载。

    延迟加载机制的操作:

    1)session.load();//延迟加载查询,session.get();是立即加载查询 2)query.iterator();//查询 3)获取关联对象的属性信息

    注意事项:这些方法返回的对象,只有id属性(主键)有值,其他属性数据在使用的时候(调用getXXX()方法时,除主键外,调主键get方法不会发SQL)才去获取。

        在使用延迟加载操作后,Hibernate返回的对象是Hibernate利用CGLIB技术(cglib.jar)新生成的一个类型(动态的在内存中生成)。在新类型中,将属性的getter方法重写。新生成的类是原实体类的子类(继承关系)。

    延迟加载的好处:

    1)提高了内存的使用效率。                

    2)可以使数据访问降低并发量。

    六、Session的get和load方法的区别

    1)相同点:两者都是按“主键”做条件查询。 2)不同点:

    ①get是立刻加载;load是延迟加载。 ②get返回的对象类型是实体类型;load返回的是动态生成的一个代理类(动态代理技术),该代理类是实体类的子类。 ③get未查到数据返回null;load未查到数据抛出ObjectNotFoundException异常。 注意事项:若实体类用了final修饰,则破坏了延迟加载机制,那么load效果与get就完全相同了。

    转载请注明原文地址: https://ju.6miu.com/read-600300.html

    最新回复(0)