在“Java Persistence with Hibernate”一书中,我遇到了一句话:
Hibernate produces all trivial CRUD SQL at startup. It caches the SQL statements
internally for future use, thus avoiding any runtime cost of SQL generation for the
most common operations.
要查看启动日志,它会说:
Enable DEBUG logging for the org.hibernate.persister.entity package, and watch (or search) the
Hibernate startup log.
我有一个简单的应用程序,其中有一个实体消息,我将持久存储在数据库中。
我在配置文件中启用了show_sql=true
。您可以在下面看到我的配置文件:
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/ajax</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">XXXX</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Use the C3P0 connection pool provider -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<!-- Show and print nice SQL on stdout -->
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<!-- List of XML mapping files -->
<mapping resource="org/myapp/hibernate/first/Message.hbm.xml" />
</session-factory>
我的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 option
log4j.rootLogger=DEBUG, stdout
# Hibernate logging options (INFO only shows startup messages)
log4j.logger.org.hibernate=DEBUG
# Log JDBC bind parameter runtime arguments
log4j.logger.org.hibernate.type=DEBUG
log4j.logger.org.hibernate.persister.entity=DEBUG
log4j.logger.org.hibernate.SQL=DEBUG
通过这些设置,我可以看到在保存/更新我的实体时,SQL会在控制台上打印出来。
但我没看到的是启动日志(我在顶部提到)。 Hibernate确实生成了SQL,但是在应用程序启动时却没有,只有在我开始处理实体时才会发生。
这里有什么问题?
答案 0 :(得分:1)
听起来你期望在启动时,你会看到一系列SQL查询。这不是发生的事情。
虽然Hibernate正在计算所需的sql查询,但它实际上并没有运行它们,所以你不会通过“show_sql = true”logging指令看到它们。
但是如果在命名查询中有错误,例如,它会在启动时抛出异常,这是我发现使用命名查询非常有用的原因之一。