2012-10-24 111 views
1

當我使用的EclipseLink 2.2.1連接我的Cloud SQL實例與JPA,它顯示了以下錯誤GAE:谷歌雲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; 
    } 
} 

Servlet是:

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,那麼你會設置了「供應商」,在「的persistence.xml」,因爲你有其他JPA也可以修復CLASSPATH以確保只有1個JPA實現存在

+0

App引擎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。那麼我認爲這是由於在不同的罐子裏有相同的包裝引起的。所以我在評論中這樣問。 –