gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:05:13 25 4
gpt4 key购买 nike

我正在为基于 JPA 的 Java 应用程序改进事务回滚支持,并且正在使用 Ecmel Ercans 的方法来处理回滚( http://weblogs.java.net/blog/davidvc/archive/2007/04/jpa_and_rollbac.html )和 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 事务中执行的命令方法。

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

有没有人有更清洁的解决方案的建议?

最佳答案

我建议使用 Spring's JPADaoSupport类,结合其 @Transactional annotation support .这为您提供了一种使用 @Transactional 以指定如何处理异常的方式来划分 DAO 方法的非常干净的方法,例如如果给定的异常触发回滚。它也与底层持久性 API 无关,因此在 JDBC、Hibernate、JPA 等中都是一致的。

它是高度声明性的,因此您的业务逻辑过于困惑的问题大大减少。

关于java - 帮助使用可重用的 JPA 事务方法(带回滚),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1205852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com