2

我正在尝试使用 @PersistenceContex 注释将 PersistenceContex 注入 POJO,我读过我需要让 POJO 设法做到这一点。所以我将我的 POJO 类注入到 servlet 中(所以它现在作为依赖对象进行管理,对吗?)但是当 servlet 试图从注入的对象调用 metod 时,我得到错误:

java.lang.IllegalStateException:无法为 unitName null 检索 EntityManagerFactory

所以看起来 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 注入它工作正常。

..::更新::..

堆栈跟踪:

警告:StandardWrapperValve [ResourcesServlet]:PWC1406:Servlet ResourcesServlet 的 Servlet.service() 抛出异常 java.lang.IllegalStateException:无法在 com.sun.enterprise.container.common.impl.EntityManagerWrapper.init(EntityManagerWrapper) 检索 unitName MambaPU 的 EntityManagerFactory .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.face.servlets.ResourcesServlet.doGet(ResourcesServlet.java:60) 的 pl.zawi.mamba.core.integration.controllers.implementation.FileEntityControlerImpl.retriveFile(FileEntityControlerImpl.java:32) javax.servlet.http.HttpServlet。服务(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。在 org.apache.catalina.connector.CoyoteAdapter.doService 调用(StandardHostValve.java:185)(CoyoteAdapter.java:325) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 在 com.sun.grizzly 的 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) .http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 在 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 在 com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954 ) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at 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)sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.爪哇:662)sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.爪哇:662)

持久性.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 中,所以请记住)

曼巴核心

4

4 回答 4

2

仅供参考:

您根本不会在 Entity 类上使用 @PersistenceContext 注释。简单地在 POJO 中包含一个 Persistence Unit 将使它们得到管理(将 persistence.xml 和一个空 beans.xml 添加到 POJO 类的 JAR 的 META-INF 文件夹中。

@PersistenceContext 用于会话 Bean,其目的是自动将 EntityManager 注入会话 bean。

于 2012-06-28T19:32:43.293 回答
1
  • 首先,您的 pojo 需要在 bean 存档中(包含beans.xmlMETA-INForWEB-INF中)才能进行管理
  • @PersistenceContext需要 a META-INF/persistence.xml,您可以在其中定义一个持久单元
  • 如果有一个持久单元并且它仍然失败,请尝试@PersistenceContext(unitName="name")
于 2011-02-17T13:51:38.657 回答
0

我有同样的问题:如果 DAO 不是无状态的,Glassfish 不会启动 EntityManager

我认为这是 Glassfish 问题,因为在 JBoss AS 6 下运行良好。

于 2011-02-17T14:34:29.323 回答
0

我有同样的问题。我SLSB用. DAO_ @Inject@PersistenceContextPOJO 中。当 POJO 与 位于同一个 Maven 项目中时EJB,一切正常。我不知道为什么,但是EJB当它在不同的项目中时不能注入 POJO(w/PU),除非我将 POJO 设为 aSLSB并使用@EJB而不是@Inject.

于 2013-01-11T17:58:29.490 回答