【问题标题】:hibernate call stack for createQuery()createQuery() 的休眠调用堆栈
【发布时间】:2013-08-09 07:36:57
【问题描述】:

我是休眠新手。我想确切地知道调用 createQuery() 时会发生什么。 hibernate 如何在内部调用 jdbc 驱动程序(基于方言)并检索结果,即发生了哪些函数调用或调用了哪些对象;我对整个调用堆栈感兴趣。

我已经从 github 下载了 hibernate-orm 源代码,但我不知道从哪里开始。对此的任何帮助将不胜感激。

问候, 苏维克

【问题讨论】:

  • 使用调试器。而是一个断点,自己寻找。

标签: hibernate jdbc


【解决方案1】:
<!--hibernate.cfg.xml -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>

显示已执行的 sql。

您必须设置一个日志系统(如 log4j)并使用此配置来跟踪所有(AST 查询树、sql、jdbc 参数等)

### direct log messages to stdout ###
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.Target=System.out
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file hibernate.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=hibernate.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=warn, stdout

#log4j.logger.org.hibernate=info
log4j.logger.org.hibernate=debug

### log HQL query parser activity
log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
log4j.logger.org.hibernate.type=info
log4j.logger.org.hibernate.type=debug

### log schema export/update ###
log4j.logger.org.hibernate.tool.hbm2ddl=debug

### log HQL parse trees
log4j.logger.org.hibernate.hql=debug

### log cache activity ###
log4j.logger.org.hibernate.cache=debug

### log transaction activity
log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
log4j.logger.org.hibernate.jdbc=debug

【讨论】:

  • 我确实尝试过这个,但我无法在日志输出中找到我想要的内容。我想知道 createQuery() 实际执行时调用了哪些方法。可能是我没有仔细查看日志。你能帮忙吗?
  • 在 session.createQuery 中设置断点并调试后续日志。我做了同样的事情来获得对休眠代码流和对象的信心。例如,方言用于为您的查询构建 sql 字符串,而 jdbc 调用的完成方式与您使用普通 jdbc 编写的方式相同。遵循代码,没有魔法,只是一种重新组装你每天使用的对象的聪明方法。通过一本关于休眠和调试器的书,我学到了很多东西!
  • 谢谢贝拉巴克斯,鲍里斯。我采纳了你的建议,终于找到了 createQuery() 的调用堆栈。
猜你喜欢
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多