我有一个由Spring框架维护的EntityManager
对象,我可以使用@PersistenceContext
注解将其注入到任何DAO类中,例如:
@PersistenceContext(unitName="entityManager")
private EntityManager em;
我使用这些DAO类将以下内容保存在数据库中...
class MyClass
{
@Resource(name="myDao")
private MyDao dao;
@Resource(name="myAnotherDao")
private MyAnotherDao anotherDao;
public void save(String s1,String s2)
{
try
{
MyEntity m=new MyEntity();
m.setName(s1);
// .. and so on ..
XYZ x=new XYZ();
x.setDEF(s2);
anotherDao.save(x);
m.setXYZ(x);
// .. some other stuff .. //
dao.saveEntity(m);
}
catch(Exception e)
{
// I would like to rollback the transaction
}
}
}
现在,这两个dao都使用通过
@PersistenceContext(unitName="entityManager")
注入的相同的EntityManager
。 现在,如果在setXYZ()
之后发生异常,那么我想回滚保存的XYZ
实体。 但是,我该如何从中获取EntityManager
呢?如果所有的dao都持有相同的对象,那么我可以调用
EntityManager
类的getTransaction().rollback()
方法吗?getTransaction()
是否返回新事务或当前与EntityManager
关联的任何事务?
@Transactional
来标记事务,并由事务管理器(通常使用JPA,即JpaTransactionManager)处理。 Spring有一个完整的章节解释事务:http://docs.spring.io/spring-framework/docs/4.1.x/spring-framework-reference/html/transaction.html。 - JB Nizet