A. hibernate session.save()怎么实现底层代码怎么看求告诉
不得不说,你截图里的这个箭头指的很帅!
我来解答一下,你先在你的代码里面,有session.save(obj)调用的地方,按下Ctrl键,然后把鼠标移动到save上(注意不要点下去),会出现一个小菜单,如下图:
看到没,上面的注释里说的,save() operations,这里的三个方法之间的调用关系,就说明这三个方法就是hibernate的session.save(obj)方法的实现所做的操作了。
不过真心不明白你看这个代码做什么,如果是你保存不成功的话,一般hibernate这种老牌框架是不会出问题的,原因在你自己代码上;如果你想研究hibernate源代码,进而自己写一个ORM框架,算我没说。
B. hibernate关于Session和Transaction打开和提交的方式
在util中直接就openSession再返回生成好的Session方便,
getCurrentSession更方做便事务的处理。
通过session.beginTransaction();再session.getTransaction().commit();
和 Transaction tx = session.beginTransaction(); 再tx.commit();看具体应用场景。
第二种比较局限,不适合在多个方法中做事务处理。
C. Hibernate的Session
不用this直接getSession();
如果不行的话就new一个自身对象
用这个对象调用getSession();
最好的办法还是自己写个HibernateUtil类把getSession()设置成静态方法封装在这个类里,要用的时候就直接HibernateUtil.getSession()
D. 如何学习hibernate源码
我来分享一下查看源码的方法:
查看源码的首要任务是要有一款上手的工具,这里用的是 IDEA。IDEA 的功能比较强大,包括 查看类结构图,debug。这两个是查看源码的关键功能。
查看源码可以静态查看和动态查看,静态查看的方法是查看类图,还有 ALT + f7 查看方法在哪里被调用或者类在哪里被调用。在看 spring 源码的时候就是用这种方法,不过这种方法对阅读者的要求比较高,包括要了解这个方法的执行,设计模式的理解,以及框架是如何配置这个类的。第二种方法是 debug。debug 方法是后来才发现的一个重要的 查看源码的方法,要点是掌握执行栈,就能掌握整个执行流程。比如这个是在debug hibernate 源码的时候的截图,可以看到这个执行栈非常深,从 spring-data-jpa 到 hibernate 中间经过好几层的代理,主要完成一些适配,事务,拦截器等等操作,然后再到 hibernate 核心代码,最后就是 jdbc 的 statement。方法栈中的每一个方法都是可以查看的,里面的变量有时候是代理了好几层,所以要 F7 进去才能看到真正的执行类。
上面是简单的简述 mybatis 的 cache 机制的源码,真正想让读者明白的是,debug 如何查看源码,查看源码需要抓住一个主题,不然在阅读庞大的框架的时候会找不着北。
所以,阅读源码需要掌握工具使用,debug, 查看类图,查看方法在哪里调用,软知识是要掌握设计模式,对框架的概念有了解。
E. HIBERNATE中的SESSION是如何定义的
是一个session,
public Emp findEmpByName(final String name) {
Object obj = ht.execute(new HibernateCallback(){
public Object doInHibernate(Session session){
Query query = session.createQuery("from Emp where name=?");
query.setString(0, name);
return query.uniqueResult();
}
});
return (Emp)obj;
}
F. Hibernate的session是怎么创建的
Hibernat
对数据库的操作是通过Session来实现的,这里的session不同于页面间传递参数的session,
而是类似于JDBC中的
Connection。Session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取都与session息息相关。
Session是由HibernateSessionFactory创建的,是线程安全的,可以让多个执行线程同时存取
HibernateSessionFactory而不会有数据共享的问题,但不能让多个线程共享一个Session。
SessionFactory对象的创建:
java代码
Configuration
cfg
=
new
Configuration().configure();
SessionFactory
sessions
=
cfg.buildSessionFactory();
session创建时使用了一个ThreadLocal类来建立一个Session管理的辅助类,使用ThreadLocal可以有效隔离执行所用的数据,
避开了Session的多线程之间的数据共享问题。
//创建一个线程本地变量。
Java代码
public
static
final
ThreadLocal
threadlocal
=
new
ThreadLocal
();
public
static
org.hibernate.SessionFactory
sessionFactory;
//获取session的方法
public
static
Sessin
getSession()
throws
HibernateException{
//返回线程局部变量的当前线程的值
Session
s
=
(Session)threadLocal.get();
//如果sessionFactory为空,重新创建sessionFactory;如果线程为空,就打开一个新的session
if(session==null
||
!session.isOpen()){
if(sessionFactory
==
null){
rebuildSessionFactory();
session
=
(sessionFactory
!=
null)
sessionFactory.openSession():null;
//
将hibernate的session放入到线程中保存;只要这个线程不结束,都可以通过线程的get()方法来获取
threadLocal.set(session);return
session;
G. Hibernate--Session的createQuery源代码
org.hibernate.impl.SessionImpl.java
public Query createQuery(String queryString) {
errorIfClosed();
checkTransactionSynchStatus();
return super.createQuery(queryString);
}