2010-11-30 2 views
2

У меня есть тест, вызывающий ошибку из-за спящего режима. Я не знаю, как решить эту проблему. Это StackTrace:TransactionSystemException: не удалось отменить транзакцию Hibernate; Сделка не началась

org.springframework.transaction.TransactionSystemException: Could not roll back Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:677) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:823) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:800) 
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:501) 
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:277) 
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:170) 
    at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:344) 
    at org.springframework.test.context.junit4.SpringMethodRoadie.runAfters(SpringMethodRoadie.java:307) 
    at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:338) 
    at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217) 
    at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197) 
    at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160) 
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) 
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) 
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: org.hibernate.TransactionException: Transaction not successfully started 
    at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:183) 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:674) 
    ... 24 more 

Это то, что тест вызывает ошибку выглядит следующим образом:

@Test 
@Transactional 
public void shouldNotBeAbleToAddCandidateWhenEmailAlreadyExistsInDatabase() { 
    Candidate c = new Candidate(); 
    c.setEmail(EMAIL); 
    c.setCompany(CompanyTest.createDefaultCompany()); 
    userDAO.create(c); 
    Candidate candidateFromDb = (Candidate) userDAO.find(c.getId()); 
    assertEquals(c, candidateFromDb); 

    Candidate failingCandidate = new Candidate(); 
    failingCandidate.setEmail(EMAIL); 
    failingCandidate.setCompany(CompanyTest.createDefaultCompany()); 


    boolean foundDuplicate = false; 
    try { 
     userDAO.create(failingCandidate); 
    } catch (DuplicateEmailException duplicateEmailException) { 
     foundDuplicate = true; 
    } 
    assertTrue(foundDuplicate); 
} 

Это то, что менеджер транзакций в applicatipnContext-dao.xml выглядит следующим образом:

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

Это приложениеContext.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-2.5.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" 
    default-autowire="byName"> 

    <bean id="dataConfigPropertyConfigurer" 
       class="org.springframework.beans.factory.config.PropertyOverrideConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>classpath:${app.env}.properties</value> 
      </list> 
     </property> 
     <property name="ignoreResourceNotFound" value="true"/> 
    </bean> 

    <bean id="wicketConfiguration" class="com.firmfactory.work.WicketConfiguration"> 
     <property name="configurationMode" value="development" /> 
     <property name="showStacktrace" value="true" /> 
    </bean> 

    <context:component-scan base-package="com.firmfactory.work.daos" /> 
    <import resource="applicationContext-controllers.xml" /> 
    <import resource="applicationContext-services.xml" /> 

    <bean name="dataSource" class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"> 
     <property name="url"> 
      <value>jdbc:mysql://localhost/workt?characterEncoding=UTF-8</value> 
     </property> 
     <property name="user"> 
      <value>work</value> 
     </property> 
     <property name="////"> 

     <!-- <value>work</value> --> 
      <value>////</value> 

     </property> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="annotatedClasses"> 
      <list> 
REMOVED SOME MODELS 

     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <!-- <bean id="liquibase" class="liquibase.spring.SpringLiquibase"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="changeLog" value="classpath:DbChangeSet.xml" /> 
    </bean>--> 

    <bean id="resumeInformationPriceString" class="java.lang.String"> 
     <constructor-arg value="25"></constructor-arg> 
    </bean> 

    <bean id="candidateInformationPriceString" class="java.lang.String"> 
     <constructor-arg value="75"></constructor-arg> 
    </bean> 

    <bean id="deafaultCompanyId" class="java.lang.Integer"> 
     <constructor-arg value="1"></constructor-arg> 
    </bean> 

    <bean id="uploadPath" class="java.lang.String"> 
     <constructor-arg value="/home/hudson/uploads/"></constructor-arg> 
    </bean> 

    <bean id="logoPath" class="java.lang.String"> 
     <constructor-arg value="../logos/"></constructor-arg> 
    </bean> 

    <tx:annotation-driven /> 
</beans> 

Отредактировано applicationContext.xml следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-2.5.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
    " 
    default-autowire="byName"> 

    <bean id="dataConfigPropertyConfigurer" 
       class="org.springframework.beans.factory.config.PropertyOverrideConfigurer"> 
     <property name="locations"> 
      <list> 
       <value>classpath:${app.env}.properties</value> 
      </list> 
     </property> 
     <property name="ignoreResourceNotFound" value="true"/> 
    </bean> 

    <bean id="wicketConfiguration" class="com.firmfactory.work.WicketConfiguration"> 
     <property name="configurationMode" value="development" /> 
     <property name="showStacktrace" value="true" /> 
    </bean> 

    <context:component-scan base-package="com.firmfactory.work.daos" /> 
    <import resource="applicationContext-controllers.xml" /> 
    <import resource="applicationContext-services.xml" /> 

    <bean name="dataSource" class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"> 
     <property name="url"> 
      <value>jdbc:mysql://localhost/work?characterEncoding=UTF-8</value> 
     </property> 
     <property name="user"> 
      <value>work</value> 
     </property> 
     <property name="///"> 

     <!-- <value>work</value> --> 
      <value>///</value> 

     </property> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="annotatedClasses"> 
      <list> 
       <removed propertys of models> 

     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.transaction">true</prop> 
      </props> 
     </property> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager" 
     p:sessionFactory-ref="sessionFactory"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <!-- <bean id="liquibase" class="liquibase.spring.SpringLiquibase"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="changeLog" value="classpath:DbChangeSet.xml" /> 
    </bean>--> 

    <bean id="resumeInformationPriceString" class="java.lang.String"> 
     <constructor-arg value="25"></constructor-arg> 
    </bean> 

    <bean id="candidateInformationPriceString" class="java.lang.String"> 
     <constructor-arg value="75"></constructor-arg> 
    </bean> 

    <bean id="deafaultCompanyId" class="java.lang.Integer"> 
     <constructor-arg value="1"></constructor-arg> 
    </bean> 

    <bean id="uploadPath" class="java.lang.String"> 
     <constructor-arg value="/home/hudson/uploads/"></constructor-arg> 
    </bean> 

    <bean id="logoPath" class="java.lang.String"> 
     <constructor-arg value="../logos/"></constructor-arg> 
    </bean> 



</beans> 

Новый (на первый взгляд одинаковые?) StackTrace:

org.springframework.transaction.TransactionSystemException: Could not roll back Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:677) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:823) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:800) 
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:501) 
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:277) 
    at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:170) 
    at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:344) 
    at org.springframework.test.context.junit4.SpringMethodRoadie.runAfters(SpringMethodRoadie.java:307) 
    at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:338) 
    at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217) 
    at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197) 
    at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160) 
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51) 
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44) 
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27) 
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37) 
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: org.hibernate.TransactionException: Transaction not successfully started 
    at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:183) 
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:674) 
    ... 24 more 
+0

Ваша конфигурация транзакции? код? – Bozho 2010-11-30 08:24:21

+0

Добавлен код. Где я могу найти конфигурацию своей транзакции? – 2010-11-30 08:29:55

ответ

2

добавить конф. в прикладном-context.xml

<tx:annotation-driven transaction-manager="transactionManager"/> 



    <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) --> 
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory"> 
    </bean> 

hibernate.properties должен содержать

org.hibernate.transaction true 

Класс испытаний должен быть сконфигурирован как

import org.junit.runner.RunWith; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.test.context.transaction.TransactionConfiguration; 
import org.springframework.transaction.annotation.Transactional; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"/yourapplication-context.xml"}) 
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) 
@Transactional 
public class MyTest { 

Примечание: не все поля могут потребоваться, у меня есть просто показан рабочий стол.

Смежные вопросы