2007-06-12
关于Hibernate解析HQL的一些疑问
关键字: J2EE开发
最近对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吧。
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吧。
评论
caige_215
2007-08-23
如果不在hbm.xml里mapping,那么对象与表怎么关联
javaIE
2007-08-20
deadcode 写道
表名不是通过HQL中的对象名解析出来的,是在hbm.xml这些mapping文件中定义的.
没有吧
deadcode
2007-08-13
表名不是通过HQL中的对象名解析出来的,是在hbm.xml这些mapping文件中定义的.
hqman
2007-08-13
楼主请问有没有办法 通过hql 解析出对应的表名???
malipei
2007-06-18
没有联系
wlcome998
2007-06-15
Hibernate中的session和用户session即HTTPSession应该没有什么必然的联系把
jackhlp
2007-06-13
wlcome998 写道
呵呵 昨天又看了些代码 在SRC下面的connection package下看到了封装的JDBC类
有什么学习Hibernate源码的资料推荐吗
有什么学习Hibernate源码的资料推荐吗
它的源码不就是资料吗?
wlcome998
2007-06-13
呵呵 昨天又看了些代码 在SRC下面的connection package下看到了封装的JDBC类
有什么学习Hibernate源码的资料推荐吗
有什么学习Hibernate源码的资料推荐吗
Lucas Lee
2007-06-13
如果底层还不是JDBC,这个hibernate也太神奇了.
;)
;)
wlcome998
2007-06-12
呵呵 就是想理解下底层的东西 才去看源码的
wlcome998
2007-06-12
那Hibernate具体调用Jdbc的源码在哪个类上呢 还有1点 HQL是面向对象的 而SQL面向表的 但Hibernate的操作都是在建立在对象之上的
dennis_zane
2007-06-12
底层肯定是jdbc,不然你说用什么呢?
- 浏览: 10425 次
- 性别:

- 来自: 南京

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
请教一个系统设计的问题
强烈建议使用数据库驱动(或者hbm驱动,但是hbm要根据数据库的设计来) 个人觉 ...
-- by coolnight -
请教一个系统设计的问题
改造旧系统是不能或很难生成自己想要的结构的,对新系统用对象建模应该做对象缓存,应 ...
-- by maming2000 -
请教一个系统设计的问题
抛出异常的爱 写道数据库驱动 页面驱动 数据模型驱动 领域模型驱动 。。。。。。 ...
-- by Joo -
请教一个系统设计的问题
感觉两者都需要兼顾,一个良好的设计必定你的闹钟都会既有领域模型,又有数据库模型, ...
-- by gblyh -
请教一个系统设计的问题
其实领域模型中的实体和实体关系模型中的实体能有多大区别呢? 领域中有些对象是要建 ...
-- by sslaowan






评论排行榜