Как внедрить @PersistenceContext в класс pojo

Я пытаюсь внедрить PersistenceContex в POJO, используя аннотацию @PersistenceContex, я читал, что мне нужно сделать так, чтобы POJO удалось это сделать. Итак, я ввожу свой класс POJO в сервлет (так что теперь он управляется как зависимый объект, я прав?), но когда сервлет пытается вызвать метод из введенного объекта, я получаю сообщение об ошибке:

java.lang.IllegalStateException: невозможно получить EntityManagerFactory для unitName null

Итак, похоже, что PersistenceContext не вводится в POJO должным образом, что мне делать, чтобы он работал?

Мой класс POJO выглядит так:

public class FileEntityControlerImpl implements FileEntityInterface {

@PersistenceContext
EntityManager entityManager;

@Override
public void createFile(FileEntity fileEntity) {
    ...}

@Override
public FileEntity retriveFile(String fileName) {
    ...}

Точка впрыска:

@Inject
FileEntityInterface fileController;

Если я использую SLSB и ввожу с помощью @EJB, все работает нормально.

..::ОБНОВИТЬ::..

трассировки стека:

постоянство.xml:

..::ОБНОВЛЕНИЕ2::..

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="MambaPU" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/MambaDB</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <shared-cache-mode>ALL</shared-cache-mode>
        <properties>
<!--            <property name="javax.persistence.jdbc.password" value="root"/>-->
<!--            <property name="javax.persistence.jdbc.user" value="root"/>-->
<!--            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>-->
<!--            <property name="eclipselink.ddl-generation" value="create-tables"/>-->
<!--            <property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.DefaultSessionLog"/>-->
            <property name="eclipselink.logging.level" value="ALL"/>
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
        </properties>
    </persistence-unit>
</persistence>

Если кому-то интересно, есть источник моего проекта, я использую maven, поэтому его легко собрать и запустить. (Диск MySql не включен в pom-s, поэтому имейте это в виду)

Mamba.Core

Просто для справки:


person zawisza017    schedule 17.02.2011    source источник


Ответы (4)


Вы вообще не используете аннотацию @PersistenceContext в классах Entity. Простое включение Persistence Unit в POJO сделает их управляемыми (добавление файла persistence.xml и пустого файла beans.xml в папку META-INF JAR-файла классов POJO.

@PersistenceContext используется в сессионных компонентах, и его целью является автоматическое внедрение EntityManager в сессионный компонент.

во-первых, ваш pojo должен находиться в bean-архиве (иметь _1_ в _2_ или _3_), чтобы им можно было управлять

person sola    schedule 28.06.2012

person Bozho    schedule 17.02.2011
comment
@zawisza017 zawisza017 можешь дать всю трассировку стека - person zawisza017; 17.02.2011
comment
Я добавил stacktrace и persistance.xml в основной пост. Мой файл уха состоит из 3 модулей: одного веб-модуля и двух модулей ejb, один из которых содержит файл persistance.xml. - person Bozho; 17.02.2011
comment
@ zawisza017 Я не уверен, может ли модуль jpa охватывать несколько модулей. попробуйте определить его в нужном модуле. - person zawisza017; 17.02.2011
comment
Когда я ввожу SLSB с полиуретаном, это работает. У меня есть 3 модуля: face.war, где находится сервлет, Integration.jar, где находится SLSB с Injectet Entity Manager, и logic.jar, где у меня есть singleton, который использует некоторые модули интеграции SLSB для заполнения базы данных. Моя цель состояла в том, чтобы заменить этот SLSB на управляющий POJO, создающий своего рода DAO, как советуют люди из stackoverflow. - person Bozho; 17.02.2011
comment
@zawisza017 это странно. Возможно, скачайте последнюю версию CDI (или используемого вами сервера приложений) - person zawisza017; 17.02.2011
comment
уже пробовал стеклянную рыбу 3.1b40 или что-то в этом роде - та же ошибка. У меня нет проблем с размещением здесь моего полного проекта, если кто-то захочет попробовать его сам. - person Bozho; 17.02.2011
comment
@zawisza017, как насчет того, чтобы попробовать это на JBoss AS 6? Гарсия отметил, что там это работает. Попробуйте - person zawisza017; 17.02.2011
comment
Я сейчас его скачиваю, у меня реле плохого качества связи - person Bozho; 17.02.2011
comment
Я скачал Jboss, но, похоже, мне нужно кое-что прочитать о том, как развернуть мое приложение... потому что первая попытка развернуть заканчивается множеством ошибок... к сожалению, у меня нет на это времени :( - person zawisza017; 17.02.2011
comment
@zawisza017 действительно очень плохо. После нескольких таких опытов я решил вообще не использовать серверы приложений, поэтому долгое время использовал только Tomcat :) - person zawisza017; 17.02.2011
comment
У кого-нибудь еще есть этот король проблем, я вообще не знаю JBoss, это плохо, если я вынужден его использовать;/ - person Bozho; 17.02.2011

Я думаю, что это проблема Glassfish, потому что он отлично работает под JBoss AS 6.

У меня такая же проблема. Мой _1_ вводит в мой _2_ объект _3_. _4_ находится в POJO. Когда POJO находится в том же проекте maven, что и _5_, все работает нормально. Я не уверен, почему, но _6_ не может внедрить POJO (с PU), когда он находится в другом проекте, если только я не сделаю POJO _7_ и не использую _8_ вместо _9_.

person Otávio Garcia    schedule 17.02.2011
comment
Если вам не нравится JBoss AS, попробуйте использовать пустой сессионный компонент без сохранения состояния, который имеет частный объект @PersistenceContext EntityManager em. Это заставляет Glassfish инициализировать модуль сохраняемости. Для меня это решение работает нормально. Я знаю, что это не очень хорошее решение, но оно работает. Я проведу дополнительные тесты, чтобы сообщить об этой проблеме команде Glassfish. - person zawisza017; 17.02.2011
comment
мой PU я уже инициализировал, более того, перед созданием сервлета я использую singleton для заполнения базы данных некоторым контентом (из этого я знаю, что PU + SLSB отлично работает при вставке между модулями) - person Otávio Garcia; 17.02.2011
comment
Как и Божо, я не знаю, может ли @Inject вводить бины из другого модуля. Я не могу найти об этом в спецификации (JSR299). - person zawisza017; 17.02.2011
comment
простая инъекция с использованием @Inject между модулями работает нормально, я уже проверил это, создав простой тестовый интерфейс с одним методом (печать) и TestImpl, а затем внедрив его в другой модуль, однако это было между двумя модулями EJB. - person Otávio Garcia; 17.02.2011
comment
ВНИМАНИЕ: StandardWrapperValve[ResourcesServlet]: PWC1406: Servlet.service() для сервлета ResourcesServlet выдал исключение java.lang.IllegalStateException: невозможно получить EntityManagerFactory для unitName MambaPU в com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper .java:121) в com.sun.enterprise.container.common.impl.EntityManagerWrapper._getDelegate(EntityManagerWrapper.java:162) в com.sun.enterprise.container.common.impl.EntityManagerWrapper.createNamedQuery(EntityManagerWrapper.java:554) ) по адресу pl.zawi.mamba.core.integration.controllers.implementation.FileEntityControlerImpl.retriveFile(FileEntityControlerImpl.java:32) по адресу pl.zawi.mamba.core.face.servlets.ResourcesServlet.doGet(ResourcesServlet.java:60) по адресу javax.servlet.http.HttpServlet.service(HttpServlet.java:734) в javax.servlet.http.HttpServlet.service(HttpServlet.java:847) в org.apache.catalina.core.StandardW rapper.service(StandardWrapper.java:1523) в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) в org .apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) на com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) на com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline .java:85) по адресу org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) по адресу org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) по адресу org.apache.catalina. Connector.CoyoteAdapter.service(CoyoteAdapter.java:226) в com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) в com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask. java:791) на com.sun.griz zly.http.ProcessorTask.doProcess(ProcessorTask.java:693) в com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) в com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java: 170) в com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) в com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) в com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java :88) на com.sun.grizzly.http. HttpProtocolChain.execute(HttpProtocolChain.java:76) на com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) на com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) на com.sun.grizzly .ContextTask.run(ContextTask.java:69) в com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) в com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java :309) на java.lang.Thread.run(Thread.java:662) - person zawisza017; 17.02.2011

beans.xml присутствует во всех модулях моего ушного файла, но внутри нет ничего особенного, и да, persistence.xml тоже присутствует. Я уже пытался добавить unitName и имя, но ошибка украла то же самое :(

person Greg    schedule 11.01.2013