Java Spring@Transactional方法不会回滚

Java Spring@Transactional方法不会回滚,java,spring,hibernate,jpa,testing,Java,Spring,Hibernate,Jpa,Testing,我有一个问题要问Spring、hibernate和testng 我正在开发一个应用程序,并尝试编写一个事务单元测试。问题是,当buissnes方法标记为事务性时,如何回滚数据库操作 守则: @Test @ContextConfiguration(locations = { "classpath:applicationContext.xml" }) @TransactionConfiguration(defaultRollback = true) public class SampleTest e

我有一个问题要问Spring、hibernate和testng

我正在开发一个应用程序,并尝试编写一个事务单元测试。问题是,当buissnes方法标记为事务性时,如何回滚数据库操作

守则:

@Test
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
@TransactionConfiguration(defaultRollback = true)
public class SampleTest extends
AbstractTransactionalTestNGSpringContextTests {


@Autowired
private AuthorDao authorDao; 

@BeforeTest
void createAppCtx() {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
            "/applicationContext.xml");

}


@Test
void testStg() {

    Person person = new Author();
    person.setFirstName("Edward");
    person.setLastName("Kowalski");
    authorDao.createAuthor(person);
}
在我的著作中,我有以下方法:

@Repository
@Transactional
public class AuthorDao {

@PersistenceContext
private EntityManager entityManager;


public AuthorDao() {

}

public AuthorDao(EntityManager entityManager) {
    this.entityManager = entityManager;
}

public Author createAuthor(Person author) {
    entityManager.persist(author);
    return (Author) author;
}
}

如果需要应用程序上下文,我也可以附加它。 正如您所看到的,buisness方法是事务性的,因此在调用之后会有一个commit。关键是如何避免在测试类中提交? 可能吗

非常感谢你的帮助

编辑: 应用程序上下文:

  <?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:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">


<context:component-scan base-package="pl.hs" />
<mvc:annotation-driven />
<tx:annotation-driven transaction-manager="myTxManager" /> 


<beans>


    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>


    <bean id="jdbcPropertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
        p:location="classpath:project.properties" />

    <bean id="myDataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"
        p:driverClassName="${hibernate.connection.driver_class}" 
        p:url="${hibernate.connection.url}"
        p:username="${hibernate.connection.username}" 
        p:password="${hibernate.connection.password}" />


    <bean id="persistenceUnitManager"
        class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
        <property name="persistenceXmlLocations">
            <list>
                <value>classpath*:META-INF/persistence.xml</value>
            </list>
        </property>
        <property name="defaultDataSource" ref="myDataSource" />
    </bean>

    <bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="myDataSource"/>
        <property name="persistenceUnitName" value="pl.hs" />
    </bean>

    <bean id="myTxManager" name="myTxManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="myEmf" />
        <!-- <property name="dataSource" ref="myDataSource" /> -->
    </bean>

</beans>
</beans>
persistence.xml:

 <?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                            http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

<persistence-unit name="pl.hs"
    transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

    <class> myJavaClasses </class>




    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <properties>

        <property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"></property>
        <property name="hibernate.show_sql" value="true" />



        <property name="hibernate.hbm2ddl.auto" value="create"></property>
    </properties>


</persistence-unit>

将@Transactional也添加到测试方法中,以便TransactionConfiguration应用。

在测试启动时启动新事务,并在测试结束时回滚

因此,您不必执行任何特殊操作来滚动当前事务

如果您想在以下各项之后添加另一个逻辑单元:

authorDao.createAuthor(person);
那么你最好写另一个测试方法


每次测试应验证一个且仅验证一个行为单元。如果您在一个测试方法中测试了多个职责,那么您应该将这些职责分解为多个测试。

为什么您要自己加载上下文?Springs测试框架已经为您完成了这项工作,并且按照当前的设置,它将回滚您的事务。好的,我删除了createAppCtx方法,但它仍然不会回滚事务如果您使用的是MySQL,请确保您使用的是InnoDB类型的事务表。如果oracle 11g有助于正确设置事务,我将使用它?您可以添加applicationContext.xml,如果有,还可以添加persistence.xml。AbstractTransactionalTestNGSpringContextTests在类上定义了@Transactional,因此无需再次将其添加到方法中。您的数据库是什么?您是否启用了自动提交功能?我正在使用Oracle 11g并启用了自动提交功能:Off是的,我知道。但是我在下一个测试中有一个“count”,由于“createAuthor”和db@RunWith用于jUnit测试,我使用的是testNg。testng有注释吗?我想它只是AbstractTransactionalTestNGSpringContextTests。不知何故,这笔交易没有得到适当的考虑。