2010-11-23 4 views
5

मैं जेपीए के लिए नौसिखिया हूं और मैंने पुस्तक से एक साधारण उदाहरण करने की कोशिश की। लेकिन कोई बात नहीं मैं मैं त्रुटि निम्न प्राप्त क्या करना:"EntityManager के लिए कोई दृढ़ता प्रदाता" त्रुटि

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named EmployeeService 
     at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89) 
     at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60) 
     at com.mycompany.simpleentity.EmployeeTest.main(EmployeeTest.java:18) 

मैं एक बहुत googled और मैं सभी कि मैं जेपीए के बारे में पढ़ा था।
यहाँ मेरी परियोजना का एक निर्देशिका वृक्ष है: EmployeeTest.java:

package com.mycompany.simpleentity; 

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

public class EmployeeTest { 
    public static void main(String[] args) { 
     EntityManagerFactory emf = Persistence.createEntityManagerFactory("EmployeeService"); 
     EntityManager em = emf.createEntityManager(); 

    } 
} 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany</groupId> 
    <artifactId>SimpleEntity</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>SimpleEntity</name> 
    <url>http://maven.apache.org</url> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>javax.persistence</groupId> 
     <artifactId>persistence-api</artifactId> 
     <version>1.0</version>  
    </dependency> 
    <dependency> 
     <groupId>postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.0-801.jdbc4</version> 
    </dependency> 
    </dependencies> 

    <build> 

     <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
      <source>1.5</source> 
      <target>1.5</target> 
      </configuration> 
     </plugin> 

     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 

      <configuration> 
       <archive> 
        <manifest> 
         <addClasspath>true</addClasspath> 
         <mainClass>com.mycompany.simpleentity.EmployeeTest</mainClass> 
         <!-- <classpathLayoutType>repository</classpathLayoutType> --> 
         <classpathMavenRepositoryLayout>true</classpathMavenRepositoryLayout> 
         <classpathPrefix>${env.HOME}/.m2/repository</classpathPrefix> 

        </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
     </plugins> 

    </build> 
</project> 

यहाँ मेरी स्रोत कोड है:

. 
|-- pom.xml 
`-- src 
    |-- main 
    | |-- java 
    | | `-- com 
    | |  `-- mycompany 
    | |   `-- simpleentity 
    | |    |-- Employee.java 
    | |    |-- EmployeeService.java 
    | |    `-- EmployeeTest.java 
    | `-- resources 
    |  `-- META-INF 
    |   `-- persistence.xml 
    `-- test 

यहाँ मेरी pom.xml है और यहां मेरा persistance.xml

<persistence 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_1_0.xsd" 
     version="1.0"> 

    <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL"> 
     <class>com.mycompany.simpleentity.Employee</class> 
     <properties> 
      <property name="toplink.jdbc.driver" 
         value="org.postgresql.Driver"/> 
      <property name="toplink.jdbc.url" 
         value="jdbc:postgresql://localhost:5432/testdb;create=true"/> 
      <property name="toplink.jdbc.user" value="postgres"/> 
      <property name="toplink.jdbc.password" value="111"/> 

     </properties> 
    </persistence-unit> 
</persistence> 

मैं क्या गलत करता हूं? अग्रिम धन्यवाद।

उत्तर

7

जेपीए एक जेपीए प्रदाताओं (हाइबरनेट, एक्लिप्ससेंक, ओपनजेपीए, टॉपलिंक) द्वारा लागू एक विनिर्देश है।

आपको अपने प्रदाता को चुनने और pom.xml पर उपयुक्त निर्भरता जोड़ने की आवश्यकता है। इसके अलावा आपको अपने प्रदाता को persistence.xml में निर्दिष्ट करने की आवश्यकता है।

उदाहरण के लिए, यदि आप OpenJPA का उपयोग (मैं इसे इस उदाहरण के बाद से अपनी नवीनतम संस्करण Maven केंद्रीय रेपो में उपलब्ध है के लिए choosed, तो विक्रेता विशिष्ट खजाने कॉन्फ़िगर करने के लिए कोई जरूरत नहीं है):

<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    <!-- Note that you don't need persistence-api dependency - it's transitive --> 
    <dependency> 
     <groupId>org.apache.openjpa</groupId> 
     <artifactId>openjpa-all</artifactId> 
     <version>2.0.1</version> 
    </dependency> 
    <dependency> 
     <groupId>postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>9.0-801.jdbc4</version> 
    </dependency> 
    </dependencies> 

<persistence 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_1_0.xsd"  
     version="1.0">  

    <persistence-unit name="EmployeeService" transaction-type="RESOURCE_LOCAL"> 
     <!-- Provider specification --> 
     <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> 

     <class>com.mycompany.simpleentity.Employee</class>  
     <properties>  
      <property name="javax.persistence.jdbc.driver"  
         value="org.postgresql.Driver"/>  
      <property name="javax.persistence.jdbc.url"  
         value="jdbc:postgresql://localhost:5432/testdb;create=true"/>  
      <property name="javax.persistence.jdbc.user" value="postgres"/>  
      <property name="javax.persistence.jdbc.password" value="111"/>  

     </properties>  
    </persistence-unit>  
</persistence> 
1

वास्तव में,

आप एक वास्तविक Peristence प्रदाता के लिए एक निर्भरता है लगता नहीं है।

जेपीए में स्वयं में कोई कार्यान्वयन नहीं है, आपको वास्तविक समाधान के रूप में हाइबरनेट/टॉपलिंक/ओपनजेपीए का भी उपयोग करने की आवश्यकता होगी।

0

आपके persistence.xml के अनुसार आप PostgreSQL के साथ TopLink का उपयोग RDBMS के रूप में कर रहे हैं। जब आप अपने pom.xml में PostgreSQL JDBC ड्राइवर का संदर्भ देते हैं, तो आपने टॉपलिंक को निर्भरता के रूप में घोषित नहीं किया है।

मेरा अनुमान है (मैं मानता हूं) यह है कि दृढ़ता API को क्लासपाथ में टॉपलिंक (आपका दृढ़ता प्रदाता) नहीं मिला है। निर्भरता के रूप में टॉपलिंक जोड़ने का प्रयास करें।

2

अगर आप की तुलना में इस कोड

<properties> 
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/Database name" /> 
      <property name="javax.persistence.jdbc.user" value="" /> 
      <property name="javax.persistence.jdbc.password" value="" /> 
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> 
</properties> 
2

1) बनाने का उपयोग जेपीए + eclipselink प्रदाता का उपयोग सुनिश्चित करें कि आप (जो भी प्रदाता के लिए) हठ प्रदाता को परिभाषित किया है: <persistence-unit ...> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> ... ... </persistence-unit>

: openjpa लिए पूर्व

2) यदि आप कस्टम बिल्ड/संकलन प्रक्रिया (मेवेन, आदि) का उपयोग कर रहे हैं तो सुनिश्चित करें कि आपका मेटा-आईएनएफ/persistance.xml संकलित/कक्षा फ़ोल्डर में कॉपी किया गया है।

+0

दूसरा बिंदु डालने के लिए धन्यवाद। यही वह समस्या थी जो मेरे पास थी। धन्यवाद!!! – nashuald

0

जेपीए विनिर्देश होने के कारण कई प्रदाताओं (कार्यान्वयनकर्ता) हैं। आपको जेपीए विनिर्देश के लिए वास्तविक बाइटकोड प्रदान करने वाला एक चुनना होगा। हाइबरनेट सामान्य पसंद है, लेकिन आपका अलग हो सकता है। एक बार जब आप इसे पहचान लेंगे, तो इसे अपने पीओएम में निर्भरता के रूप में जोड़ें। अन्यथा, अपने निर्माण पथ में जेएआर फ़ाइल जोड़ें।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^