簡體   English   中英

如何在Liberty核心8.5上的MFPF V7.1 Java適配器中使用JPA時解決PersistenceException?

[英]How to fix PersistenceException in using JPA in MFPF V7.1 Java Adapter on Liberty core 8.5?

我想在以下環境中使用Java Adapter中的JPA。

  • MFPF V7.1
  • WAS Liberty核心8.5.5.5(獨立)
  • DB2 v10.1.0.872

我用Eclipse向導制作了JPA項目和Entity類,並將MFPF Project war * / WebContent / WEB-INF / lib *放在jar中。 這個jar包含實體類並對其進行處理。 但是,這不起作用。 您能給我有關如何解決此問題的信息嗎?

問題
運行此語句並導致異常。 javax.persistence.PersistenceException:提供程序錯誤。 提供者:org.apache.openjpa.persistence.PersistenceProviderImpl

EntityManagerFactory factory = Persistence.createEntityManagerFactory("JPAProject2");


Jar中的實體類

package model;
import java.io.Serializable;
import javax.persistence.*;
@Entity
@Table(name="USERS")
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String firstname;
private String lastname;

@Column(name="\"PASSWORD\"")
private String password;

@Id
@Column(name="\"USERID\"")
private String userid;

在jar中處理實體類

public class Calljpa {
public String getData(String uid){
try {
EntityManagerFactory factory =ersistence.createEntityManagerFactory("JPAProject2");
EntityManager entityManager = factory.createEntityManager();
     EntityTransaction tx = entityManager.getTransaction();

     System.out.println("find start");
     tx.begin();
     User user = entityManager.find(User.class, "001");
     tx.commit();
     System.out.println("User id = " + user.getUserid()+"  firstName = "+user.getFirstname());   
     return "Hello " + user.getLastname();

  } catch (Exception e) {
     System.out.println(e);
     return "error ";
  } 
}

持久性

<?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="JPAProject2" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>jdbc/db2</non-jta-data-source>
<class>model.User</class>
<properties>
     <property name="javax.persistence.jdbc.url" value="jdbc:db2://localhost:50000/SAMPLE:retrieveMessagesFromServerOnGetMessage=true;"/>
     <property name="javax.persistence.jdbc.user" value="db2admin"/>
     <property name="javax.persistence.jdbc.password" value="worklight"/>
     <property name="javax.persistence.jdbc.driver" value="com.ibm.db2.jcc.DB2Driver"/>
  </properties>
</persistence-unit>
</persistence>

Server.xml

<feature>jdbc-4.0</feature>
<feature>servlet-3.0</feature>
<feature>ssl-1.0</feature>
<feature>beanValidation-1.0</feature>
<feature>cdi-1.0</feature>
<feature>jpa-2.0</feature>
-----
<application id="TestJA" name="TestJA" location="TestJA.war" type="war">
    <classloader delegation="parentLast">
        <privateLibrary id="worklightlib_TestJA">
            <fileset dir="${shared.resource.dir}/TestJA" includes="TestJA.jar"/>
            <fileset dir="${shared.resource.dir}/TestJA/lib" includes="worklight-jee-library.jar"/>
            <fileset dir="${wlp.install.dir}/lib" includes="com.ibm.ws.crypto.passwordutil_*.jar"/>
          </privateLibrary>
    </classloader>
</application>
<library id="TestWeb/DB2Lib">
    <fileset dir="C:/SQLLIB/java" includes="db2jcc4.jar,db2jcc_license_cu.jar"/>
</library>
<dataSource id="db2" jndiName="jdbc/db2">
<jdbcDriver libraryRef="TestWeb/DB2Lib"/>
<properties.db2.jcc databaseName="SAMPLE" serverName="localhost" portNumber="50000"/>
</dataSource>

從您的問題中可以理解,所有這些代碼都在項目的服務器/庫中的JAR內部。

如果是這樣,請檢查persistence.xml是否位於JAR根目錄下的META-INF文件夾下。 這樣做的原因是Persistence.createEntityManagerFactory在類路徑中每個項目的根目錄下的META-INF文件夾下查找persistence.xml。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM