关于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缓存消失了。此对象也就没有太大意义了