尽管在hibernate.cfg.xml
文件中设置了一些属性,但我还是无法从Hibernate获得更多的控制台输出(以帮助调试)。例如,添加行<property name="show_sql">true</property>
实际上并未在控制台中显示SQL语句。
我也尝试过使用log4j.properties
文件的内容 - 比如设置log4j.logger.org.hibernate=debug
- 没有运气。我错过了什么?
编辑: hibernate-service.xml文件的内容为
<server>
<mbean code="org.jboss.hibernate.jmx.Hibernate"
name="jboss.har:service=Hibernate_SMS">
<attribute name="DatasourceName">java:/SMS_DS</attribute>
<attribute name="Dialect">org.hibernate.dialect.HSQLDialect</attribute>
<attribute name="SessionFactoryName">java:/hibernate/SessionFactory</attribute>
<attribute name="CacheProviderClass">org.hibernate.cache.HashtableCacheProvider</attribute>
<attribute name="ShowSqlEnabled">true</attribute>
</mbean>
</server>
但是,我不能100%确定这是否真的有任何影响。该XML文件位于Eclipse项目中,用于处理我的数据库内容,但似乎不在JBoss部署目录中。
编辑2:这肯定是作为HAR部署的。也就是说,我很确定我需要hibernate.cfg.xml
- 我记得当映射文档作为该文件中的条目被省略时会出现问题。我认为HAR是使用ant生成的 - 在build.xml文件中有一个目标:
<target name="har" depends="prepare" description="Builds the Hibernate HAR file">
<mkdir dir="${class.root}" />
<mkdir dir="${distribution.dir}" />
<jar destfile="${distribution.dir}/${har.name}">
<!-- include the hbm.xml files -->
<fileset dir="${class.root}">
<include name="**/*.hbm.xml"/>
<include name="com/[redacted]/sms/data/dto/*.class"/>
<include name="com/[redacted]/sms/data/dto/base/*.class"/>
</fileset>
<!-- include jboss-service.xml -->
<metainf dir="${hibernate.dir}">
<include name="hibernate-service.xml"/>
</metainf>
</jar>
</target>
但是当我在hibernate-service.xml文件中使用格式错误的xml进行ant构建时,它不会失败。 更新即使完全删除文件也不会导致构建失败。这里有什么想法? 结束更新
听起来让Hibernate输出SQL语句应该(如果一切设置正确)完全处理它 - 这是否意味着log4j.properties中的设置在这里不会产生影响? - 因为实际上 在运行ant时会改变输出。
编辑3:在遇到我的数据har
的其他奇怪问题后,我完全删除了har文件并使用har
ant构建目标重建了它。突然间一切正常!感谢国际象棋,因为他非常乐于助人。不能说我到底知道到底是做了什么,但我更愿意承认他的努力,而不是写下并接受我自己的答案;如果你不是“他”,我道歉。
答案 0 :(得分:14)
正确的属性名称是hibernate.show_sql,它肯定有效。
确保您的hibernate.cfg.xml
是正确的,并且它已被拿起;同样适合您的log4j.properties
文件。我知道这些似乎是愚蠢的建议,但它们占“缺少日志记录输出”问题的98%。
更新:我会更新答案,而不是继续添加评论。
您需要确保JBoss选择了hibernate-service.xml
。检查的简单方法是向它添加一个语法错误(比如在某个元素上省略右括号)并查看JBoss在重启期间是否爆炸:-)它应打包到har
并作为你的一部分进行部署构建过程,所以如果你意识到它是而不是被JBoss选中,那就是这个地方。我将摆脱hibernate.cfg.xml
中的冲突设置(例如,您指定为mbean属性的所有内容都不应在hibernate.cfg.xml
中复制)。就此而言,你甚至需要hibernate.cfg.xml
吗?如果部署为HAR
,则应自动扫描/拾取您的映射。
答案 1 :(得分:8)
我只使用log4j.properties文件来记录Hibernate语句。对于SQL语句, log4j.logger.org.hibernate.SQL 属性需要设置为 debug ,对于SQL参数/返回值, log4j.logger .org.hibernate.type 属性需要设置为跟踪。
这是我使用的log4j.properties文件:
### 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
### Root logger
log4j.rootLogger=debug, stdout
### Main Hibernate
log4j.logger.org.hibernate=debug
### log just the SQL
log4j.logger.org.hibernate.SQL=debug
### log JDBC bind parameters
log4j.logger.org.hibernate.type=trace
答案 2 :(得分:1)
还要确保您使用正确的log4j配置。
在jboss中运行时(你正在这样做,对吧?),你可以在$JBOSS_HOME/server/<config>/conf/jboss-log4j.xml
中配置log4j-logging。
有两个默认的appender; FILE
向log/server.log
和CONSOLE
写入stdout
(有时会重定向log/console.log
)。将appender上的阈值调整为文件中的DEBUG
或通过设置systemproperty jboss.server.log.threshold
(取决于您使用的jboss版本)。
您还需要通过添加类别来调整休眠的日志记录优先级:
<category name="org.hibernate">
<priority value="DEBUG"/>
</category>