【问题标题】:Getting the EntityManager created by OpenEntityManagerInViewFilter programmatically以编程方式获取由 OpenEntityManagerInViewFilter 创建的 EntityManager
【发布时间】:2014-10-06 13:31:34
【问题描述】:

This question 对基于注释和 aop 的解决方案感到满意,这与我的情况正好相反。请不要将其签名为重复。)

我使用命名的 Servlet 过滤器为每个请求获取不同的线程本地 EntityManager。

我想获取属于实际 Servlet 请求(线程)的 EntityManager。

我想要一个简单的程序解决方案。用 spring aop 注释我的一些类不起作用,这正是我想要避免的。


附:深入研究spring source code,我可以在spring-orm/src/main/java/org/springframework/orm/jpa/support/OpenEntityManagerInViewFilter.java 中找到以下代码,它创建EntityManager 并将其注册到实际的Request 中:

EntityManager em = createEntityManager(emf);
EntityManagerHolder emHolder = new EntityManagerHolder(em);
TransactionSynchronizationManager.bindResource(emf, emHolder);

AsyncRequestInterceptor interceptor = new AsyncRequestInterceptor(emf, emHolder);
asyncManager.registerCallableInterceptor(key, interceptor);
asyncManager.registerDeferredResultInterceptor(key, interceptor);

如我所见,这段代码以某种方式将新创建的 EntityManager 注册到实际的线程本地数据中。这个问题是通过明确的程序解决方案获取这些数据的“美丽”方式。

【问题讨论】:

    标签: spring jpa entity servlet-filters interceptor


    【解决方案1】:

    您的类中不需要任何与 Spring 相关或 AOP 相关的东西,而需要 EntityManager。只需放置EntityManager 类型的字段并在其上放置默认的@PersistenceContext(来自JPA),就会注入正确的EntityManager。与 AOP 无关。

    public class MyDao {
    
        @PersistenceContext
        private EntityManager em;
    
    }
    

    如果您还有OpenEntityManagerInViewFilter,它将创建一个EntityManager 并将其绑定到当前正在执行的线程。然后将其注入该字段(实际上它是委托调用的代理)。

    假设您的配置中有<context:annotation-config /><context:component-scan />@PersistenceContext 应该可以工作。使用基于 Java 的配置时,默认情况下启用此功能。

    【讨论】:

    • 我有,但它不起作用,EntityManager 保持为空,独立于我所做的。最后,我删除了所有注释(甚至是 @Transactional 注释),现在我正在按程序进行所有操作。这是对项目的一次重大重构。它会起作用。我知道。
    • 我怀疑你还有其他方法会起作用,你还没有发布你的配置,所以实际问题是什么(我怀疑配置错误)。因此,如果您仍然需要帮助,请添加您的配置(xml 和可能的 web.xml)。
    • 很抱歉,我已经看到您的回答是正确的,没问题。不幸的是,我使用了一个可悲的质量 Spring AOP 东西,我努力让它正常工作,这是我麻烦的真正原因。
    猜你喜欢
    • 2013-09-11
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2019-12-20
    相关资源
    最近更新 更多