作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想优化只读查询,所以我想在事务之外执行 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/
我是一名优秀的程序员,十分优秀!