#java #hibernate #spring #jakarta-ee
#java #гибернация #spring #джакарта-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());
}
}
Пока все запуски file test проходят успешно, но только то, что нет вывода sql, мне интересно, что могло быть причиной этого.Поскольку это первый раз, когда я полагаюсь на trasactionConfiguration, я подумал, что это может быть причиной того, что sql не отображается, кроме того, что другой предыдущий проект показывает sql.
Как я могу решить эту проблему, например, принудительно отображать sql-скрипты (пока не используя log4j) спасибо за чтение.
Комментарии:
1. При использовании транзакций наиболее вероятно, что SQL регистрируется только во время завершения транзакции. При использовании Hibernate без Spring это так. В вашем случае @Transactional должен заключить сделку.
2. Здравствуйте, спасибо за ваш комментарий. Я понял первую часть вашего комментария. Не могли бы вы немного подробнее рассказать об использовании
@transactional
? я не уверен, что понимаю весь смысл вашего предложения. еще раз спасибо
Ответ №1:
Вы используете
@TransactionConfiguration(defaultRollback=true)
@Transactional
Поскольку ваши транзакции откатываются по умолчанию, возможно, что Hibernate не выполняет никаких инструкций SQL, потому что очистка сеанса не происходит перед откатом.
Вы можете отключить откат тестовых транзакций, установив defaultRollback = false
(или @Rollback(false)
на уровне метода).
Если вы хотите, чтобы Hibernate выдавал реальные инструкции SQL, но не хотите фиксировать ваши тестовые транзакции, вы можете вызвать flush()
в конце ваших тестовых методов.
Комментарии:
1. спасибо, это действительно работает, когда я добавляю
userDAO.getSessionFactory().getCurrentSession().flush();
перед утверждением assert каждого теста. Основная идея об откате заключается в том, что я хочу чистую установку в основном после каждого запуска тестового класса.