Почему 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, этого может быть достаточно для ваших нужд.