2012-10-24 7 views
1
내가는 EclipseLink 2.2.1을 사용하여 JPA 내 클라우드 SQL 인스턴스를 연결

작동하지 않습니다, 그것은 오류를 다음 보여줍니다GAE는 : Google 클라우드 SQL + JPA는

W 2012-10-24 12:21:46.120 
org.datanucleus.metadata.xml.AbstractMetaDataHandler error: MetaData Parser encountered an error in file "file:/base/data/home/apps/s~appengineaplicationID/8.362672796318745816/WEB-INF/classes/META-INF/persistence.xml" at line 2, column 248 : cvc-complex-type.3.1: Value '2.0' of attribute 'version' of element 'persistence' is not valid with respect to the corresponding attribute use. Attribute 'version' has a fixed value of '1.0'. - Please check your specification of DTD and the validity of the MetaData XML that you have specified. 

W 2012-10-24 12:21:46.885 
Error for /jpatest 
java.lang.ExceptionInInitializerError 
    at com.my.jpa.ContactService.createContact(ContactService.java:20) 
    at com.my.jpa.JPATestServlet.doGet(JPATestServlet.java:16) 
Caused by: org.datanucleus.exceptions.NucleusUserException: No available StoreManager found for the datastore URL key "". Please make sure you have all relevant plugins in the CLASSPATH (e.g datanucleus-rdbms?, datanucleus-db4o?), and consider setting the persistence property "datanucleus.storeManagerType" to the type of store you are using e.g rdbms, db4o 

W 2012-10-24 12:21:46.887 
Nested in java.lang.ExceptionInInitializerError: 
javax.persistence.PersistenceException: Provider error. Provider: org.datanucleus.jpa.PersistenceProviderImpl 
    at javax.persistence.Persistence.createFactory(Persistence.java:176) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:112) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:66) 
    at com.my.jpa.EMF.<clinit>(EMF.java:8) 
    at com.my.jpa.ContactService.createContact(ContactService.java:20) 
    at com.my.jpa.JPATestServlet.doGet(JPATestServlet.java:16) 

C 2012-10-24 12:21:46.893 
Uncaught exception from servlet 
java.lang.ExceptionInInitializerError 
    at com.my.jpa.ContactService.createContact(ContactService.java:20) 
    at com.my.jpa.JPATestServlet.doGet(JPATestServlet.java:16) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 

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="JPATest"> 
     <class>com.my.jpa.Contact</class> 
     <properties> 
      <property name="javax.persistence.jdbc.driver" value="com.google.cloud.sql.Driver" /> 
      <property name="javax.persistence.jdbc.url" value="jdbc:google:rdbms://instance_name/db" /> 
      <property name="javax.persistence.jdbc.user" value="" /> 
      <property name="javax.persistence.jdbc.password" value="" /> 
     </properties> 
    </persistence-unit> 
</persistence> 
입니다

내 엔티티 관리자 팩토리 클래스는 다음과 같습니다

public final class EMF { 
    private static final EntityManagerFactory emfInstance = Persistence 
      .createEntityManagerFactory("JPATest"); 

    private EMF() { 
    } 

    public static EntityManagerFactory get() { 
     return emfInstance; 
    } 
} 

서블릿은 다음과 같습니다

,451,515,
public class JPATestServlet extends HttpServlet { 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) 
      throws IOException {   
     ContactService service = new ContactService(); 
     service.createContact(new Contact("Manu", "Mohan", "686019", "TVM")); 
     resp.setContentType("text/plain"); 
     resp.getWriter().println("Hello, world"); 
    } 
} 

엔티티 클래스는 다음과 같습니다

@Entity 
public class Contact { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 
    private String firstName; 
    private String lastName; 
    private String phoneNumber; 
    private String address; 

    public Contact() { 
    } 

    public Contact(String fn, String ln, String pn, String addr) { 
     this.firstName = fn; 
     this.lastName = ln; 
     this.phoneNumber = pn; 
     this.address = addr; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getPhoneNumber() { 
     return phoneNumber; 
    } 

    public void setPhoneNumber(String phoneNumber) { 
     this.phoneNumber = phoneNumber; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 
} 

답변

1

한 당신은 EclipseLink를 사용하려는 경우, 당신은 당신이 다른 JPA이 있기 때문에, "의 persistence.xml"에서 "제공자"로 설정 것이라고 생각 CLASSPATH의 구현도 또는 대안으로 CLA PATH를 수정하여 현재 JPA 구현이 1 개만 있는지 확인하십시오.

+0

App Engine SDK와 EclipseLink 2.2.1은 모두 다음 패키지를 포함합니다. javax.persistence, javax.persistence .criteria, javax.persistence.metamodel, javax.persistence.spi. 그런 다음이 JPA 구현 문제를 해결하는 방법. –

+0

내 대답을 읽지 않는 이유는 무엇입니까? persistence.xml에 "provider"를 지정해야합니다. "javax.persistence"는 JPA의 * 구현 *이 아니며 API이며 그 이상입니다. – DataNucleus

+0

예 저는 공급자를 구현하고 위의 오류와 경고를 수정했습니다. 하지만 배포 한 후 응용 프로그램이 중지되었습니다. java.lang.NoClassDefFoundError : 클래스 com.my.jpa.EMF를 초기화 할 수 없습니다. 그때 나는 그것이 다른 항아리에있는 동일한 포장 때문에 일으키는 원인이되었다는 것을 생각했다. 그래서 나는 코멘트에서 그렇게 부탁했다. –