Почему JPA-инъекция не работает на @PersistentUnit

Это вопрос продолжения ( bean-компонент struts 2 не создан) Я использую topts2 + toplink в моем очень простом веб-приложении под Tomcat. На странице я хотел бы использовать итерационный тег. Вот почему я объявил некоторую фабрику (SomeFactory), которая разрешает сбор сущностей (Entity). В статье: http://download-uk.oracle.com/docs/cd/B32110_01/web.1013/b28221/usclient005.htm единственное, что мне нужно, это объявление:

@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? Как выполнить предварительную инициализацию toplink для веб-приложения, чтобы обеспечить внедрение?

1 ответ

Решение

Tomcat не вводит ничего, что не является контейнером Java EE (и даже с контейнером Java EE 5 внедрение работает только для управляемых компонентов, таких как сервлеты, фильтры, прослушиватели, EJB, конечные точки веб-службы...). Так что вам придется создать EntityManagerFactory вручную (обычно в классе сервлета или помощника) и получите EntityManager от него:

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

Обратите внимание, что создание EntityManagerFactory является дорогостоящей операцией и не должна выполняться для каждого запроса. Тем не менее, создавая EntityManager нет, и вы должны получить один для каждой темы. Но в вашем случае я бы предложил использовать http://code.google.com/p/struts2-persistenceplugin для решения этой проблемы.

Спасибо, но [...] кажется, что Java EE не является обязательным для использования инъекций [...], Spring приносит для этого необходимый движок.

В самом деле. Но вы написали "НИКАКОЙ пружины вообще" в своем другом вопросе, и вы не перечислили ничего, что могло бы обеспечить инъекцию из коробки. В любом случае, проверьте http://code.google.com/p/struts2-persistenceplugin, этого может быть достаточно для ваших нужд.

Другие вопросы по тегам