Почему JPA-инъекция не работает на @PersistentUnit - PullRequest
0 голосов
/ 04 апреля 2010

Продолжение вопроса ( бин 2 стоек не создан ) Я использую Struts2 + toplink в моем очень простом веб-приложении под Tomcat. На странице я хотел бы использовать итерационный тег. Вот почему я объявил некоторую фабрику (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? Как выполнить предварительную инициализацию toplink для веб-приложения, чтобы разрешить внедрение?

1 Ответ

0 голосов
/ 04 апреля 2010

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

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

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

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

Действительно. Но вы написали «НЕТ пружины вообще» в своем другом вопросе, и вы не перечислили ни одного предмета, который мог бы обеспечить инъекцию из коробки. В любом случае, проверьте struts2-persistenceplugin , этого может быть достаточно для ваших нужд.

...