Session 方法


        用Hibernate肯定会频繁的用到session,下面就将Hibernate session中一些经常的用方法逐个的解释一下。
1.Transaction beginTransaction()
        开始一个工作单元并返回一个与之相关Transaction对象,最为事务的开始,通常在需要对数据库进行更改例如save,update或delete时使用。在事务结束后需要调用Transaction的commit方法提交更改,该方法必须在Hibernate session关闭之前使用。
2.void flush() void clear()
        这两个方法通常在一起使用。由于Hibernate有缓存数据的功能,所以当我们要批量查询和批量插入时,会因为大量的缓存而导致内存溢出。所以我们可以在执行批量插入时插入一定数目的数据后调用flush()提交插入,然后调用clear()清空当前Hibernate session内的所有缓存。批量查询同理
3.Connection close()
        关闭Hibernate session,同时清空所有的缓存。
4.Connection connection()
        获取当前Hibernate session使用的JDBC connection。
5.boolean contains(Object object)
        返回boolean值,判断一个实例是否与当前Hibernate session保持关联,即为持久化状态。
6.Query createQuery(String queryString)
        返回一个给定HQL语句的Query对象。
7.SQLQuery createSQLQuery(String queryString)
        返回一个用于执行原生SQL语句的SQLQuery对象
8.void delete(Object object)
        由持久状态/游离状态 -->>自由状态,删除与该对象关联的数据里内的一条记录。该对象可以是处于持久化状态也可以是处于瞬态但与数据库的记录有id联系。如果该对象的cascade属性为delete或all将会同时删除相关联的数据。
9.void delete(String entityName, Object object)
        同上,从数据库中移除持久化(persistent)对象的实例。
10.Connection disconnect()
        断开与session与当前JDBC的连接,如果连接有Hibernate管理,则将连接送回连接池,否则将送回给程序本身。
11.Object get(Class clazz, Serializable id)
        根据指定的实体类以及实体id返回一个实体的实例。如果找不到记录则返回null
12.Object get(String entityName, Serializable id)
        同上,entity为实体的名字
13.String getEntityName(Object object)
        返回一个持久化类的实体名
14.Serializable getIdentifier(Object object)
        返回一个被session缓存的实体实例的id
15.Query getNamedQuery(String queryName)
        返回一个在映射文件中定义的命名查询的query对象
16.SessionFactory getSessionFactory()
        获取生成当前session的SessionFactory
17.Transaction getTransaction()
        获取与这个session关联的Transaction(事务)实例。 instance associated with this session.
18.Object load(Class theClass, Serializable id)
        在符合条件的实例存在的情况下,根据给定的实体类和标识返回持久化状态的实例。
19.Object load(String entityName, Serializable id)
        Session.get/load的区别:
       A.如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObejctNotFoundException。
       B.Load方法可返回实体的代理类类型,而get方法永远直接返回实体类。
       C.Load方法可以充分利用内部缓存和二级缓存中现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
20.Serializable save(Object object)
        将一个实体实例持久化,返回该持久化实例的id。在持久化之前必须手动或自动的指派id。
       Session.save方法的执行步骤:
       1.在Session内部缓存中寻找待保存对象。内部缓存命中,则认为此数据已经保存(执行过insert操作),实体对象已经处于Persistent状态,直接返回。
       2.如果实体类实现了lifecycle接口,则调用待保存对象的onSave方法。
       3.如果实体类实现了validatable接口,则调用其validate()方法。
       4.调用对应拦截器的Interceptor.onSave方法(如果有的话)。
       5.构造Insert SQL,并加以执行。
       6.记录插入成功,user.id属性被设定为insert操作返回的新记录id值。
       7.将user对象放入内部缓存。
       8.最后,如果存在级联关系,对级联关系进行递归处理。
21.void update(Object object)
        通过给定的分离状态的实例的id更新数据库记录。如果在持久化类中有相同的id则会抛出异常。如果这个实例cascade设置为save-update或all是将同时更新所有关联的实例记录。
       Session.update方法的执行步骤:
       1.根据待更新实体对象的Key,在当前session的内部缓存中进行查找,如果发现,则认为当前实体对象已经处于Persistent状态,返回。
       2.初始化实体对象的状态信息(作为之后脏数据检查的依据),并将其纳入内部缓存。注意这里Session.update方法本身并没有发送Update SQL完成数据更新操作,Update SQL将在之后的Session.flush方法中执行, 根据id更新所有的字段,如update user set name=?, password=? where id=?。
22.void saveOrUpdate(Object object)
       Session.saveOrUpdate方法的执行步骤:
       1.首先在Session内部缓存中进行查找,如果发现则直接返回。
       2.执行实体类对应的Interceptor.isUnsaved方法(如果有的话),判断对象是否为未保存状态。
       3.根据unsaved-value判断对象是否处于未保存状态。
       4.如果对象未保存(Transient状态),则调用save方法保存对象。
       5.如果对象为已保存(Detached状态),调用update方法将对象与Session重新关联。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值