论坛首页 Java企业应用论坛

关于Hibernate解析HQL的一些疑问

浏览 11047 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-12  
最近对Hibernate理论比较感兴趣,小研究了Hibernate的部分源码,对其中的流程进行了简单的总结并存在些疑问,希望高手给于帮助或者推荐些相应的学习资料,谢谢!

Hibernate首先是使用了自己的数据库操作语言-HQL
Hibernate解析HQL的编译分析器用的是ANTLR分析器
HQL虽然是一种数据库操作语言,它只是方便编写和使用,本质上还是要转换成SQL语言来在数据库上执行的。
Hibernate在转换时主要用到了ANTLR,ANTLR是JAVA编写的词法分析器和语法分析器,功能很强大。
ANTLR将HQL转化成SQL语句,再实际执行SQL语句。
ANTLR所对应的文件名的格式是*.g的格式,Hibernate的jar包中含有3个语法定义文件。
Hibernate包含了3个语法定义文件:
 1. hql.g定义了词法分析和语法分析,将hql解释成hql的抽象语法树(AST) 。
 2. hql-sql.g将hql AST转化为sql AST,将生成模块与hibernate解耦。
 3. sql -gen.g 从sql AST生成sql 语言。 

详细可以查看Hibernate中的createQuery()的调用过程
通过QueryPlanCache的getHQLQueryPlan()方法获得查询计划HQLQueryPlan的一个实例,而后者主要是调用了 QueryTranslator的compile方法,编译HQL语句。在QueryTranslator的继承类 QueryTranslatorImpl的doCompile观察这个过程:
PHASE 1 : Parse the HQL into an AST.
PHASE 2 : Analyze the HQL AST, and produce an SQL AST.
PHASE 3 : Generate the SQL.

本人的一些疑问在于当HQL被ANTLR通过编译转换成SQL以后,Hibernate的具体执行流程以及于POJO的关联,它将通过哪些类和哪些方法用什么样的方式来执行SQL,总不会还是用的JDBC吧。
<p:colorscheme colors="#0066cc,#ffffff,#003b76,#ccecff,#33cccc,#66ccff,#ffffcc,#ffcc66"> </p:colorscheme>
   发表时间:2007-06-12  
底层肯定是jdbc,不然你说用什么呢?
0 请登录后投票
   发表时间:2007-06-12  
那Hibernate具体调用Jdbc的源码在哪个类上呢  还有1点 HQL是面向对象的  而SQL面向表的 但Hibernate的操作都是在建立在对象之上的 
0 请登录后投票
   发表时间:2007-06-12  
呵呵 就是想理解下底层的东西 才去看源码的
0 请登录后投票
   发表时间:2007-06-13  
如果底层还不是JDBC,这个hibernate也太神奇了.
;)
0 请登录后投票
   发表时间:2007-06-13  
呵呵 昨天又看了些代码 在SRC下面的connection package下看到了封装的JDBC类
有什么学习Hibernate源码的资料推荐吗
0 请登录后投票
   发表时间:2007-06-13  
wlcome998 写道
呵呵 昨天又看了些代码 在SRC下面的connection package下看到了封装的JDBC类
有什么学习Hibernate源码的资料推荐吗

它的源码不就是资料吗?
0 请登录后投票
   发表时间:2007-06-15  
Hibernate中的session和用户session即HTTPSession应该没有什么必然的联系把
0 请登录后投票
   发表时间:2007-06-18  
没有联系
0 请登录后投票
   发表时间:2007-08-13  
楼主请问有没有办法 通过hql 解析出对应的表名???
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics