关于Hibernate里面session的crud方法解析

1.

SessionFactory这个是工厂类,生产session的,就相当于JDBC里面的DriveMannager,

第一种获取Session的方法

Session session = SessionFactory.openSession();

session就是用来数据库crud的,也就是update,delete,select,insert的,

相当于JDBC的statement,prearatement,

用openSession()获取session,是每次调用这个方法的时候获取一个新的session

第二种获取Session的方法

Session session =SessionFactory.getCurrentSession();

它获取的session是通过上下文, session有个Context方法用来管理session的

获取session后放入线程池进行管理,也就是说Session达到了共享

什么时候用openSession() 什么时候用getCurrentSession()????

最主要的是我们在用事务的时候尽量用getCurrentSession

它可以保持数据的完整性,避免不必要的错误,

比如你修改一张表的同时,另外一个人在插入,此时如果你用openSession的话,

如果你修改一张表失败,另外一个人有插入成功,而数据库是原子性的,

事务性的特点是,要么全部成功,要么全部失败.

显然这里用OpenSession()是不正确的,

getCrueetSession()为什么可以达到数据库的原子性呢?

原因是它是线程安全的.他们共用一个session,一个session的事务肯定是同步的

他们两者还有个区别,当在查询的时候要用openSession(),如果用getCurrentSession()就会出异常。

我们来浅谈下Session的几个常用方法:

当我们对表进行插入数据,修改数据,删除数据的时候

一定要开启事务,和提交事务,及回滚事务,

这样Hibernate才能把数据对象与表映射起来,不然也只能是在内存中做了修改

一旦连接断开,数据就消失,而数据库里面数据没有任何变化

但是进行查数据的时候就不用担心了

1.load方法和get方法

load(Class,id)通过对象和id来查找相应的数据,返回该数据对应的实体类对象

load和get方法很相似都是进行数据库的查找,

但是load()方法是懒加载,它不是直接进行sql语句查询,而是去缓冲区中查询,如果缓冲区

中没有此对象,就会去二级缓存里面查找,如果没有,它不会去数据库中查询

而是直接返回一个代理类对象,通过这个代理类对象可以查询到ID,

如果一旦你关闭Session后

是无法查询到其他数据,如果进行查询会抛出异常,如果一定要查询到,就必须初始化这个代理类

用到Hibernate.initialize(object)这样就可以进行查询了

但是session不关闭又会有很大的影响,这个解决办法可以用spring来解决

而get方法是直接进行sql语句查询的,缓存区中查找不到,直接跑到数据库中去查找

如果数据库中查找不到就会返回一个null

2.save方法是进行插入操作

session.save(Object obj);插入你实体类的对像。然后运用Hibernate的sql语句进行insert操作

在这里我强调一点

如果你的对象set了Id是无效的,如果你配置文件中指定了指定的增长方式,就按照指定的进行

如果没指定,hibernate会自动的增长,从1开始

因为看Log加载程序是Hibernate有个序列还是触发的。

当你save方法后。 对象就从瞬态变成持久化,会被保存到session二级缓存中..

在commit之前,你可以再对对象进行set 而最后调用commit的时候,就会以最后set的值来与数据库对应

commit方法的作用是,把缓存中的数据与数据库进行同步。

3.update, delete,方法

update是进行数据的更新。

update是把数据从游离状态编程持久状态

delete对数据进行删除操作

delete是把数据从持久状态编程移除状态,它还会在session缓存区中,但是

在数据库中对应的数据没有了

一旦session缓存消失了。此对象也就没有太大意义了

相关推荐