如何从Hibernate获取更多调试消息?

Mat*_*all 12 java debugging jboss hibernate log4j

尽管在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>
Run Code Online (Sandbox Code Playgroud)

不过,我不是百分百确定这是否真的有任何影响.该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>
Run Code Online (Sandbox Code Playgroud)

但是当我在hibernate-service.xml文件中使用格式错误的xml进行ant构建时,它不会失败.更新即使完全删除文件也不会导致构建失败.这里有什么想法?结束更新

这听起来像让Hibernate输出SQL语句应该(如果一切设置正确)完全处理它 - 这是否意味着log4j.properties中的设置在这里不会产生影响?- 因为在运行ant时实际上确实会改变输出.

编辑3:在遇到我的数据的其他奇怪问题后,我har完全删除了har文件,并使用harant build target 重建了它.突然间一切正常!感谢国际象棋,因为他非常乐于助人.不能说我到底知道到底是做了什么,但我更愿意承认他的努力,而不是写下并接受我自己的答案; 如果你不是"他",我道歉.

Chs*_*y76 14

正确的属性名称是hibernate.show_sql,它绝对有效.

确保你hibernate.cfg.xml是正确的,并且它被拾起; 同样适用于您的log4j.properties文件.我知道那些似乎是愚蠢的建议,但它们占"缺少日志记录输出"问题的98%.

更新:我将更新答案,而不是继续添加评论.你确实需要确保hibernate-service.xmlJBoss能够接你.检查的简单方法是向它添加一个语法错误(比如忽略某个元素上的右括号)并查看JBoss在重启期间是否爆炸:-)它应该打包har并作为构建过程的一部分进行部署,所以如果你意识到它没有被JBoss接收,那就是它的地方.我会摆脱相互冲突的设置hibernate.cfg.xml(例如,你指定的所有内容都不应该复制到mbean属性中hibernate.cfg.xml).就此而言,你甚至需要hibernate.cfg.xml吗?如果部署为HAR,则应自动扫描/拾取您的映射.


jwa*_*ell 8

我只是使用log4j.properties文件来记录Hibernate语句.对于SQL语句,需要将log4j.logger.org.hibernate.SQL属性设置为debug,对于SQL参数/返回值,需要将log4j.logger.org.hibernate.type属性设置为trace.

这是我使用的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
Run Code Online (Sandbox Code Playgroud)