【问题标题】:Why JPA injection not works on @PersistentUnit为什么 JPA 注入不适用于 @PersistentUnit
【发布时间】:2010-04-04 09:32:04
【问题描述】:

问题继续(struts 2 bean is not created) 我在 Tomcat 下的非常简单的 Web 应用程序中使用 struts2 + toplink。 在页面上我想使用迭代标签。这就是为什么我声明了一些工厂(SomeFactory)来解析实体(Entity)的集合。 每篇文章:http://download-uk.oracle.com/docs/cd/B32110_01/web.1013/b28221/usclient005.htm#CIHCEHHG 我唯一需要的是声明:

@PersistenceContext(unitName="name_in_persistence_xml")
public class SomeFactory
{
    @PersistenceUnit(unitName="name_in_persistence_xml")
    EntityManagerFactory emf;

    public EntityManager getEntityManager() {
       assert(emf != null); //HERE every time it is null
       return emf.createEntityManager();
    }
    public Collection<Entity> getAll()
    {
       return getEntityManager().createNamedQuery("Entity.findAll").getResultList();
}
}

怎么了?可能我错过了 web.xml 中的某些内容吗?如何为 Web 应用预初始化 toplink 以允许注入?

【问题讨论】:

    标签: java jpa dependency-injection struts toplink-essentials


    【解决方案1】:

    您不会得到不是 Java EE 容器的 Tomcat 注入的任何东西(即使使用 Java EE 5 容器,注入也仅适用于托管组件,如 servlet、过滤器、侦听器、EJB、Web 服务端点...... )。因此,您必须手动创建EntityManagerFactory(通常在 servlet 或助手类中)并从中获取EntityManager

    EntityManagerFactory emf  = Persistence.createEntityManagerFactory(PU_NAME);
    EntityManager entityManager = emf.createEntityManager();
    

    请注意,创建EntityManagerFactory 是一项代价高昂的操作,不应针对每个请求进行。但是,创建EntityManager 不是,您应该为每个线程获取一个。但在你的情况下,我建议使用struts2-persistenceplugin 来处理这个问题。

    谢谢,但似乎 [...] Java EE 不是强制使用注入 [...] Spring 为它带来了必要的引擎。

    确实如此。但是您在另一个问题中写了 "NO spring at all",并且您没有列出任何可以提供开箱即用注射的部件。无论如何,请查看struts2-persistenceplugin,它可能足以满足您的需求。

    【讨论】:

    • 谢谢,但似乎(我的意思是“似乎”,因为我对此并不真正了解)Java EE 不是强制使用注入的。查看示例struts.apache.org/2.x/docs/struts-2-spring-2-jpa-ajax.html - Spring 为它带来了必要的引擎。那你能解释一下:我可以使用xwork(它已经是struts2的一部分)以与spring相同的方式实现注入吗?
    猜你喜欢
    • 2021-05-05
    • 2021-10-31
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 2017-08-20
    • 2015-03-14
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多