gpt4 book ai didi

java - 如何在 spring 事务之外执行 JPA 代码

转载 作者:行者123 更新时间:2023-11-29 08:21:16 24 4
gpt4 key购买 nike

我想优化只读查询,所以我想在事务之外执行 JPQL 查询,这样从 JPQL 返回的实体将不会在当前持久化上下文中进行管理(以节省脏检查和不必要的管理这些实体的成本在持久性上下文中节省 2 倍的大小)。

我在下面试过,

@Repository
public class CustomPostRepository {

@Autowired
private EmployeeRepository employeeRepository;


@Transactional
public void foo() {
// Some other transactional code (read-write) here ...

final TransactionStatus transactionStatus = TransactionAspectSupport.currentTransactionStatus(); // returns current active transaction
System.out.println("transactionStatus.isNewTransaction() = " + transactionStatus.isNewTransaction()); // returns TRUE

List<Post> posts = employeeRepository.bar();

// Some other code here...
}
}


@Repository
public class CustomJpaEmployeeDao implements EmployeeRepository {

@PersistenceContext
private EntityManager em;

@Override
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public List<Post> bar() {
// Ideally this method should throw Exception, as transaction is expected to be suspended (not exists here)
final TransactionStatus transactionStatus = TransactionAspectSupport.currentTransactionStatus();

final List<Post> post = em.createNamedQuery("Post.findAllForReporing", Post.class).getResultList();
System.out.println("entityManager.contains(post) = " + em.contains(post.get(0))); // returns true, which should be false

return post;
}
}

来电者,

@Test
public void jpqlTest() {
customPostRepository.foo();
}

我想在事务之外执行 EmployeeRepository#bar(由 CustomPostRepository#bar 创建),但是 Propagation.NOT_SUPPORTED 不工作JPQL 中的所有选定实体都在当前持久性上下文中进行管理。

那么,有什么方法可以避免在事务之外管理这些实体或执行代码吗?或者这里缺少什么?

最佳答案

您应该删除 @Transactional 注释。在这种情况下,除非方法本身不抛出 LazyInitializationException,否则它不会产生任何影响。如果存在需要事务的情况,则必须为它创建一个单独的方法/从同一个 bean 调用它,这样就不会创建代理。

此外,EntityManager#contains 不检查进程是否在事务中运行或实体是否被脏检查。

如果您不想/不能更改这些方法,请使用 EntityManager#detach

关于java - 如何在 spring 事务之外执行 JPA 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57917164/

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