2013-06-24 5 views
1

Есть так много вопросов об этом сообщении об ошибке уже на StackOverflow, , но я не могу найти решение ...Ошибка: поставщик Persistence для EntityManager

Ошибки:

SEVERE: Mapped exception to response: 500 (Internal Server Error) javax.persistence.PersistenceException: No Persistence provider for EntityManager named CreateJPA at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:84) at org.odata4j.producer.jpa.JPAProducerFactory.create(JPAProducerFactory.java:32) at org.odata4j.producer.resources.DefaultODataProducerProvider.newProducerFromFactory(DefaultODataProducerProvider.java:113) at ........

Мой 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 находится под JPA Материалы в проводнике проекта:

enter image description here

Мой pom.xml (также доступны для просмотра here): enter image description 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; 
} 

UPDATE: 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; 
    } 

} 
+1

Я думаю, вы должны иметь 'persistence.xml' в' META-INF' папке. –

+0

Я просто попробовал попробовать - никаких изменений в ошибке. – AllieCat

+0

Можете ли вы показать свой 'pom.xml'? –

ответ

0

Для стандартного применения JavaSE, место META-INF\persistence.xml в корне папки src.

Если вы используете диспетчер объектов, управляемых контейнером JEE, то обязательно используйте JTA как тип транзакции, а не RESOURCE_LOCAL. Затем убедитесь, что WebContent->META-INF содержит persistence.xml.

например.

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