Spring 3.0.5 + hibernate 3.6 hibernate.show_sql не отображается. Это из-за использования транзакции? - PullRequest
1 голос
/ 13 апреля 2011

У меня есть небольшой проект 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>

вот мое приложениеContext:

    <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) спасибо за чтение.

1 Ответ

2 голосов
/ 13 апреля 2011

Вы используете

@TransactionConfiguration(defaultRollback=true) 
@Transactional 

Поскольку ваши транзакции откатываются по умолчанию, возможно, что Hibernate не выполнит никаких операторов SQL, потому что очистка сеанса не происходит до отката.

Вы можете отключить откат тестовых транзакций, установив defaultRollback = false (или @Rollback(false) на уровне метода).

Если вы хотите, чтобы Hibernate выдавал реальные операторы SQL, но не хотите фиксировать ваши тестовые транзакции, вы можете вызвать flush() в конце ваших тестовых методов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...