Java 使用可重用的JPA事务方法(带回滚)的帮助

Java 使用可重用的JPA事务方法(带回滚)的帮助,java,jpa,transactions,Java,Jpa,Transactions,我将事务回滚支持追溯到基于JPA的java应用程序,并使用Ecmel Ercans的方法处理回滚()和JPA连接到回滚的扭结。它看起来像这样: EntityManager em = emf.createEntityManager(); EntityTransaction tx = null; try { tx = em.getTransaction(); tx.begin(); ... ... tx.commit(); } catch(Exception ex) { if(tx != nul

我将事务回滚支持追溯到基于JPA的java应用程序,并使用Ecmel Ercans的方法处理回滚()和JPA连接到回滚的扭结。它看起来像这样:

EntityManager em = emf.createEntityManager();
EntityTransaction tx = null;
try {
tx = em.getTransaction();
tx.begin();
...
...
tx.commit();
} catch(Exception ex) {
  if(tx != null && tx.isActive()) tx.rollback();
} finally {
  em.close();
}
关于这一点,我有两个问题。首先,这个解决方案出现的线程已经有两年了——从那以后,托管实体和回滚的问题已经解决了吗

如果不是,问题是解决方案有点笨重,并且模糊了实际要做的事情。我想让它成为一个通用方法,我可以调用并插入我想要的任何JPA操作。我已经使用它有一段时间了,我的泛型方法应该使用一个匿名类的实例,在JPA事务中使用命令方法

然而,我尝试使用匿名类的任何解决方案都会变得和最初的问题一样麻烦。这主要是因为我需要访问我使用的任何实体,无论是在事务方法调用之前还是之后,以及在匿名类内部,通常都是这三个实体。再加上将数据移动到匿名类中所增加的开销,如果在代码中“深入”这么做,感觉就像是浪费

有人对更清洁的解决方案有什么建议吗?

我建议将类与它的。这为您提供了一种非常干净的方法,用@Transactional来划分DAO方法,以指定如何处理异常,例如,给定的异常是否会触发回滚。它也不知道底层的持久性API,所以在JDBC、Hibernate、JPA等方面是一致的

它是高度声明性的,因此您的业务逻辑过于混乱的问题大大减少了