我正在运行一个jpa
/spring-mvc
项目,并在此代码中:
@Autowired
private GenericDao<AoModification, Integer> modif_dao;
....
@Transactional
public void save_ao( ... )
throws ParseException, UnsupportedEncodingException {
modif_dao.delete(ao.getAoModifications());
modif_dao.create(new AoModification(
new SimpleDateFormat("dd/MM/yyyy").parse(mf.date), mf.txt));
....
我得到了java.text.ParseException: Unparseable date: "06-10-2011"
,忘了把它拿走了new SimpleDateFormat("dd-MM-yyyy").parse(mf.date)
。
问题是我甚至出现了异常,这条线modif_dao.delete(ao.getAoModifications());
一直保留在数据库中,交易没有回滚,我失去了所有的钱AoModifications
。
那么问题出在哪里!
在@Repository
注释要创建具有自动的方法@Transactional
?
hibernate.xml
<context:component-scan base-package="service"/>
<context:component-scan base-package="dao"/>
<tx:annotation-driven transaction-manager="transactionManager" />
dao.GenericDaoJpaImpl.java
@Repository
public class GenericDaoJpaImpl<T, PK extends Serializable>
implements GenericDao<T, PK> {
@PersistenceContext
protected EntityManager entityManager;
....
@Override
public void delete(T t) {
this.entityManager.remove(this.entityManager.contains(t) ? t : this.entityManager.merge(t));
}
@Override
public void delete(Set<T> ts) {
for( T t : ts){
delete(t);
}
}
}
它不会回滚,因为java.text.ParseException是从java.lang.Exception继承的,而不是从java.lang.RuntimeException继承的。默认情况下,发生RuntimeException时会回滚带有@Transactional批注的方法。
您可以捕获ParseException(或Exception)并重新抛出RuntimeException,例如:
@Transactional
public void save_ao( ... ) {
try {
modif_dao.delete(ao.getAoModifications());
modif_dao.create(new AoModification(
new SimpleDateFormat("dd/MM/yyyy").parse(mf.date), mf.txt));
....
} catch (Exception e) {
throw new RuntimeException("Error when saving ao...", e);
}
或者,您可以使用rollbackFor选项将@Transactional批注修改为回滚异常:
@Transactional(rollbackFor=Exception.class)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句