可能tx.begin()
引发了异常。这意味着该catch
子句中没有要回滚的活动事务。这就是为什么tx.rollback()
引发另一个异常(隐藏原始错误)的原因。
要查看源异常,请重写您的catch
块:
} catch (RuntimeException re) {
log.error("persist Failed", re); //moved to top
tx.rollback();
throw re;
}
同样不是在这里混概念。一方面,您要声明注入的实体管理器(@PersistenceContext
),另一方面,您是通过EntityManagerFactory
编程方式创建的。
如果这是一个JEE bean,则应如下所示:
@Stateless
public class TLinkEquipementDAOImpl implements TLinkEquipementDAO {
private static final Log log = LogFactory.getLog(TLinkEquipementDAOImpl.class);
@PersistenceContext
private EntityManager entityManager;
public void persist(TLinkEquipement transientInstance) {
log.debug("persisting TLinkEquipement instance");
entityManager.persist(transientInstance);
log.debug("persist successful");
}
//Staff
}
此处,事务管理和实体管理器管理由容器(应用程序服务器)处理。
如果在容器外部使用此类,则可能如下所示:
public class TLinkEquipementDAOImpl implements TLinkEquipementDAO {
private static final Log log = LogFactory.getLog(TLinkEquipementDAOImpl.class);
//I'm assuming getEntityManagerFactory() returnes an already created EMF
private EntityManagerFactory emf = PersistenceManager.getInstance()
.getEntityManagerFactory();
private EntityManager entityManager = emf.createEntityManager();
public void persist(TLinkEquipement transientInstance) {
EntityTransaction tx = entityManager.getTransaction();
log.debug("persisting TLinkEquipement instance");
try {
tx.begin();
entityManager.persist(transientInstance);
tx.commit();
log.debug("persist successful");
} catch (RuntimeException re) {
log.error("persist Failed", re);
if(tx.isActive()) {
tx.rollback();
}
throw re;
}
}
//Staff
}