Java Spring@Transactional方法不会回滚
我有一个问题要问Spring、hibernate和testng 我正在开发一个应用程序,并尝试编写一个事务单元测试。问题是,当buissnes方法标记为事务性时,如何回滚数据库操作 守则: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
@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。不知何故,这笔交易没有得到适当的考虑。