java - Spring 3.0.5 + hibernate 3.6 hibernate.show_sql 未显示。是否由于使用了事务?

标签 java hibernate spring jakarta-ee

我有一个小型 Maven 项目

            <artifactId>spring-core</artifactId>
            <artifactId>spring-test</artifactId>
            <artifactId>spring-beans</artifactId>
            <artifactId>spring-context</artifactId>
            <artifactId>spring-aop</artifactId>
            <artifactId>spring-context-support</artifactId>
            <artifactId>spring-tx</artifactId>
            <artifactId>spring-orm</artifactId>  
            <artifactId>spring-web</artifactId>
            <artifactId>spring-webmvc</artifactId>
            <artifactId>spring-asm</artifactId>
            <artifactId>log4j</artifactId>
            <artifactId>hibernate-core</artifactId>
            <artifactId>hibernate-cglib-repack</artifactId>
            <artifactId>hsqldb</artifactId>


    <spring.version>3.0.5.RELEASE</spring.version>
    <hibernate.version>3.6.1.Final</hibernate.version>
    <hibernate-cglig-repack.version>2.1_3</hibernate-cglig-repack.version>
    <log4j.version>1.2.14</log4j.version>
    <javax-servlet-api.version>2.5</javax-servlet-api.version>
    <hsqldb.version>1.8.0.10</hsqldb.version>
    <mysql-connector.version>5.1.6</mysql-connector.version>
    <slf4j-log4j12.version>1.5.2</slf4j-log4j12.version>
    <slf4j-api.version>1.5.8</slf4j-api.version>
    <javaassist.version>3.7.ga</javaassist.version>

这是我的 applicationContext :

    <context:component-scan base-package="com.project.personal.admin.model"/>
<context:annotation-config />

<bean id="propertyconfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:mysql.hibernate.properties</value>
            <value>classpath:mysql.jdbc.properties</value>
        </list>
    </property>
</bean>
<context:annotation-config/>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}"  />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>

            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
            <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
        </props>
    </property>
    <property name="packagesToScan" value="com.project.personal.admin.model.domain" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

mysql.hibernate.properties

hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.hbm2ddl.auto=create

这是一个小测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:META-INF/test-project-admin-config.xml"})
@TransactionConfiguration(defaultRollback=true)
@Transactional
public class UserDAOImplTest {

  @Resource(name="manager")
  Manager manager;

  @Autowired
  UserDAO userDAO;

  public UserDAOImplTest() {
  }



@Test
public void testSave() {
    User u1 = manager.CreateUser();
   //.....
    userDAO.save(u1);
    User expResult = u1;

    User result = (User)userDAO.getById(u1.getId());

    Assert.assertEquals(expResult, result);
    Assert.assertEquals(expResult.getId(), result.getId());

}

@Test
public void testUpdate(){

    User u2 = manager.CreateUser();
    //....
    u2.setPassword("mypassword");
    userDAO.save(u2);

    User fromdb =(User) userDAO.getById(u2.getId());

    fromdb.setEmail("claud@somemail.com");
    userDAO.save(fromdb);

    User result = (User) userDAO.getById(fromdb.getId());

    Assert.assertNotNull(result);
    Assert.assertEquals(fromdb.getEmail(), result.getEmail());

}

}

到目前为止,所有运行文件测试都成功,但只是没有 sql 输出,我想知道可能是什么原因造成的。因为这是我第一次依赖 trasactionConfiguration,我认为这可能是原因除了之前的其他项目显示 sql 之外,没有显示 sql。

我如何解决这个问题,因为强制显示sql脚本(尚未使用log4j) 感谢您的阅读。

最佳答案

您使用

@TransactionConfiguration(defaultRollback=true) 
@Transactional 

由于默认情况下事务会回滚,因此 Hibernate 可能不会执行任何 SQL 语句,因为回滚之前不会发生 session 刷新。

您可以通过设置 defaultRollback = false (或在方法级别设置 @Rollback(false))来禁用测试事务的回滚。

如果您希望 Hibernate 发出真正的 SQL 语句,但不想提交测试事务,则可以在测试方法末尾调用 flush()

关于java - Spring 3.0.5 + hibernate 3.6 hibernate.show_sql 未显示。是否由于使用了事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5648595/

相关文章:

java - 使用 TYPE 通过 Inheritance.table_per_class 策略仅选择特定类

java.lang.NoClassDefFoundError : com/google/gson/Gson

java - 用于查找文件夹中丢失的文件编号的代码

java - Ignite集群不同启动时间

从 shell 脚本创建时 java 进程创建失败

java - 创建sessionFactory对象失败.java.lang.NoClassDefFoundError

java - 如何避免过多的 hibernate 刷新到数据库

Java 声音剪辑循环帧位置

java - 如何为 MockServer 的相同请求设置不同的响应?

spring - Spring HTTP 调用程序的 TLS/SSL 配置