我想優化只讀查詢,所以我想在事務之外執行 JPQL 查詢,以便從 JPQL 返回的實體不會在當前持久性上下文中進行管理(為了節省臟檢查和不必要的管理這些實體的成本,以節省 2 倍的大?。┰诔志眯陨舷挛闹校N以谙旅鎳L試過,@Repositorypublic 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... }}@Repositorypublic 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; }}呼叫者,@Testpublic void jpqlTest() { customPostRepository.foo();}我想EmployeeRepository#bar在事務之外執行(由 C 創建ustomPostRepository#bar),但Propagation.NOT_SUPPORTED不起作用,并且來自 JPQL 的所有選定實體都在當前持久性上下文中進行管理。那么,有什么方法可以避免管理這些實體或在事務之外執行代碼呢?或者這里缺少什么?
1 回答

慕村9548890
TA貢獻1884條經驗 獲得超4個贊
您應該刪除@Transactional
注釋。在這種情況下,除非方法本身不拋出異常,否則不會產生任何影響LazyInitializationException
。如果存在需要事務的情況,則必須為其創建一個單獨的方法/從同一個 bean 調用它,這樣就不會創建代理。
也不EntityManager#contains
檢查進程是否在事務內運行或實體是否經過臟檢查。
如果您不想/無法更改這些方法,請使用EntityManager#detach
.
添加回答
舉報
0/150
提交
取消