Как вставить @PersistenceContext в класс pojo - PullRequest
2 голосов
/ 17 февраля 2011

Я пытаюсь внедрить 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, он работает нормально.

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

StackTrace:

ПРЕДУПРЕЖДЕНИЕ: 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.StandardWrapper.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.grizzly.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) at java.lang.Thread.run (Thread.java:662)

persistance.xml:

<?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>

.. :: UPDATE2 :: ..

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

Ответы [ 4 ]

2 голосов
/ 28 июня 2012

Только для справки:

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

@ PersistenceContext используется в сеансеБин и его цель - автоматически внедрить EntityManager в бин сеанса.

1 голос
/ 17 февраля 2011
  • во-первых, ваше pojo должно быть в архиве бинов (иметь beans.xml в META-INF или WEB-INF) для управления
  • @PersistenceContext требуется META-INF/persistence.xml, где вы определяете постоянную единицу
  • , если есть постоянная единица, и она все еще отказывает, попробуйте @PersistenceContext(unitName="name")
0 голосов
/ 11 января 2013

У меня та же проблема. Мой SLSB вводит мой DAO объект с @Inject. @PersistenceContext находится в POJO. Когда POJO находится в том же проекте Maven, что и EJB, все работает нормально. Я не уверен, почему, но EJB не может ввести POJO (w / PU), когда он находится в другом проекте, если я не сделаю POJO SLSB и использую @EJB вместо @Inject.

0 голосов
/ 17 февраля 2011

У меня та же проблема: Glassfish не вызывает EntityManager, если DAO не является лицом без состояния

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

...