【问题标题】:Error: No Persistence provider for EntityManager错误:EntityManager 没有持久性提供程序
【发布时间】:2013-06-21 08:02:11
【问题描述】:

StackOverflow 上已有关于此错误消息的很多问题,但我找不到解决方案...

错误是:

严重:将异常映射到响应:500(内部服务器错误) javax.persistence.PersistenceException:没有名为 CreateJPA 的 EntityManager 的持久性提供程序 在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:84) 在 org.odata4j.producer.jpa.JPAProducerFactory.create(JPAProducerFactory.java:32) 在 org.odata4j.producer.resources.DefaultODataProducerProvider.newProducerFromFactory(DefaultODataProducerProvider.java:113) 在........

我的 persistence.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="createJPA" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>model.Cumulative</class>
    <class>model.Date</class>
    <class>model.Department</class>
    <class>model.Holiday</class>
    <class>model.Log</class>
    <class>model.Member</class>
    <class>model.Person</class>
    <class>model.Project</class>
    <properties>
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/resource_db"/>
        <property name="javax.persistence.jdbc.user" value="root"/>
        <property name="javax. persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="javax.persistence.jdbc.password" value=""/>
    </properties>
</persistence-unit>
</persistence>

由这一行调用(没有错误):

EntityManagerFactory emf = Persistence.createEntityManagerFactory("createJPA", properties);

我的 persistence.xml 在 Project Explorer 中的 JPA Content 下:

我的 pom.xml 是(也可以查看 here):

CreateEntityManagerFactory 是:

 public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) {

    EntityManagerFactory emf = null;
    PersistenceProviderResolver resolver = PersistenceProviderResolverHolder.getPersistenceProviderResolver();

    List<PersistenceProvider> providers = resolver.getPersistenceProviders();

    for (PersistenceProvider provider : providers) {
        emf = provider.createEntityManagerFactory(persistenceUnitName, properties);
        if (emf != null) {
            break;
        }
    }
    if (emf == null) {
        throw new PersistenceException("No Persistence provider for EntityManager named " + persistenceUnitName);
    }
    return emf;
}

更新:JPAFactory(createEntityManagerFactory 函数中没有属性值)

package org.odata4j.producer.jpa;

import java.util.Properties;
import java.util.logging.Logger;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.odata4j.producer.ODataProducer;
import org.odata4j.producer.ODataProducerFactory;

public class JPAProducerFactory implements ODataProducerFactory {

  private final Logger log = Logger.getLogger(getClass().getName());

  public static final String PUNAME_PROPNAME = "odata4j.jpa.persistenceUnitName";
  public static final String NAMESPACE_PROPNAME = "odata4j.jpa.edmNamespace";
  public static final String MAX_RESULTS_PROPNAME = "odata4j.jpa.maxResults";

  @Override
   public ODataProducer create(Properties properties) {

  String persistenceUnitName = properties.getProperty(PUNAME_PROPNAME);
    if (persistenceUnitName == null || persistenceUnitName.length() == 0)
      throw new RuntimeException("Missing required property: " + PUNAME_PROPNAME);

    String edmNamespace = properties.getProperty(NAMESPACE_PROPNAME, "");
    String maxResults = properties.getProperty(MAX_RESULTS_PROPNAME, "50");

    log.info(String.format("Using persistence unit [%s] with edm namespace [%s] and max results [%s]", persistenceUnitName, edmNamespace, maxResults));
    log.info("Persistence name is:" + persistenceUnitName);
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("createJPA");
    JPAProducer producer = new JPAProducer(emf, edmNamespace, Integer.parseInt(maxResults));
    return producer;
  }

 }

【问题讨论】:

  • 我认为您应该在META-INF 文件夹中包含persistence.xml
  • 我只是快速尝试了一下——错误没有改变。
  • 你能出示你的pom.xml吗?
  • 已添加。我无法添加它是代码 - 我把它放在这里:docs.google.com/document/d/…
  • 在声明EntityManager时属性变量是做什么的?你试过没有他们吗?另一方面,在我的实验中,我没有在 persistence.xml 文件中指定任何 标记,并且一切正常。

标签: java tomcat jpa persistence.xml odata4j


【解决方案1】:

对于标准 JavaSE 应用程序,将 META-INF\persistence.xml 放在 src 文件夹的根目录中。

如果您使用的是 JEE 容器托管实体管理器,您肯定会使用 JTA 而不是 RESOURCE_LOCAL 作为您的事务类型。然后确保WebContent-&gt;META-INF 包含persistence.xml

例如

<persistence-unit name="createJPA" transaction-type="JTA">
    <jta-data-source>jdbc/MyDatasource</jta-data-source>
</persistence-unit>

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 2022-11-20
    • 2012-11-03
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多