我试图为@Transactional
创建测试用例。
@ContextConfiguration(locations = {"classpath:/META-INF/spring/app-context.xml" })
@RunWith(SpringJUnit4ClassRunner.class)
public class TransactionalAnnotationTest {
public static final BigDecimal PROD_ID = new BigDecimal(1234);
@PersistenceContext
HibernateEntityManager em;
@Test
public final void testTransactionIsolation() {
String original = em.find(ProductImpl.class, PROD_ID).getDescription();
// original = "Foo"
updateTx(original);
}
@Transactional
public final void updateTx(String original) {
ProductImpl product = em.find(ProductImpl.class, PROD_ID);
product.setDescription("Bar");
whatIsInDB(original);
}
private void whatIsInDB(String original) {
String sameTxDescription = em.find(ProductImpl.class, PROD_ID).getDescription();
assert !sameTxDescription.equals(original);
}
}
失败了!第二个em.find
不应该返回带有"Bar“的产品吗?
发布于 2013-08-23 03:07:20
嗯,我让它开始工作了。
em.flush()
(这要感谢@TaoufikMohdit )。如果没有事务,flush()
将抛出一个TransactionRequiredException
!@Transactional
只适用于Spring管理的Beans。所以我创建了一个服务:
@Service public class BasicTransactionalService { @PersistenceContext HibernateEntityManager em;@Transactional (){ em.flush();}@ @Deprecated (){ em.flush();}@ testFlushSubroutineTransactional() { testFlushOutsideTransactional();}}现在它很好用。
顺便说一下,这是我的app-config.xml
<beans>
<bean class="BasicTransactionalService" />
<bean class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean" />
<bean class="org.springframework.orm.jpa.JpaTransactionManager" />
<tx:annotation-driven />
<beans>
发布于 2013-08-22 07:23:28
在设置"description“字段后,尝试显式刷新上下文
product.setDescription("Bar");
em.flush();
whatIsInDB(original);
https://stackoverflow.com/questions/18381335
复制