我找不到错误:许多人似乎在使用PU名称创建EntityManagerFactory时遇到问题。但是我检查了所有的建议,到目前为止没有任何帮助。 我正在尝试构建我的第一个JavaFX2应用程序。它是一个小型字典应用程序,最初构建在Netbeans Application框架上(通过扩展默认的“Master-Detail”生成的类)。它使用SQLite数据库。
我现在将它从那里移植到另一个(启用JavaFX2的)项目。我首先着手在新应用程序中重建JPA持久性内容。据我所知,我已经掌握了所有内容:META-INF / persistence.xml,使用与原始应用程序相同的数据库连接声明了所有必需的实体类。
我添加了 eclipselink-2.3.0.jar ; eclipselink-javax.persistence-2.0.jar 和 eclipselink-jpa-modelgen-2.3.0.jar 到项目中。
而不是Application Context我使用一个简单的Properties类来保存以前在.properties文件中的数据(例如查询)。
这是测试类:
package ithildinfx;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.Group;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import javafx.beans.property.StringProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
public class IthildinFX extends Application {
private void init(Stage primaryStage) {
entityManager = javax.persistence.Persistence.createEntityManagerFactory("IthildinFXPU").createEntityManager();
entryQuery = entityManager.createQuery(Properties.entryQuery).setParameter("gloss", "a%");
entryList = entryQuery.getResultList();
Group root = new Group();
primaryStage.setScene(new Scene(root));
(TableColumn definitions)
(TableView code)
root.getChildren().add(tableView);
}
@Override
public void start(Stage primaryStage) throws Exception {
init(primaryStage);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
private javax.persistence.EntityManager entityManager;
private java.util.List<ithildinfx.Entry> entryList;
private javax.persistence.Query entryQuery;
}
这是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="IthildinFXPU" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>ithildinfx.Dataclass</class>
<class>ithildinfx.Metadata</class>
<class>ithildinfx.Translation</class>
<class>ithildinfx.Entry</class>
<class>ithildinfx.TrMd</class>
<class>ithildinfx.Language</class>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:sqlite:lib/db/ithildin-13-11-11.db"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.driver" value="org.sqlite.JDBC"/>
<property name="javax.persistence.jdbc.user" value=""/>
</properties>
</persistence-unit>
</persistence>
我在StackOverflow上阅读的其中一条建议是将此行添加到 manifest.mf :
Meta-Persistence: META-INF/persistence.xml
,可能:
JPA-PersistenceUnits: IthildinFXPU
但两者都没有任何区别。
这是我不变的输出:
Building jar: /Users/luthien/NetBeansProjects/IthildinFX/dist/IthildinFX.jar
Copy libraries to /Users/luthien/NetBeansProjects/IthildinFX/dist/lib.
Building jar: /Users/luthien/NetBeansProjects/IthildinFX/dist/IthildinFX.jar
Detected JavaFX Ant API version 1.1
Deleting: /Users/luthien/NetBeansProjects/IthildinFX/dist/IthildinFX.jar
Deleting: /Users/luthien/NetBeansProjects/IthildinFX/dist/lib/IthildinFX.jar
Deleting: /Users/luthien/NetBeansProjects/IthildinFX/dist/README.TXT
Skip jar copy to itself: IthildinFX.jar
Skip jar copy to itself: lib/eclipselink-2.3.0.jar
Skip jar copy to itself: lib/eclipselink-javax.persistence-2.0.jar
Skip jar copy to itself: lib/eclipselink-jpa-modelgen-2.3.0.jar
Skip jar copy to itself: lib/sqlite-jdbc-3.7.2.jar
jfx-deployment:
jar:
run:
Exception in Application start method
java.lang.NullPointerException
at javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver.getProviderNames(Unknown Source)
at javax.persistence.spi.PersistenceProviderResolverHolder$DefaultPersistenceProviderResolver.getPersistenceProviders(Unknown Source)
at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
at ithildinfx.IthildinFX.init(IthildinFX.java:29)
at ithildinfx.IthildinFX.start(IthildinFX.java:109)
at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:298)
at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:136)
at com.sun.javafx.application.PlatformImpl$3.run(PlatformImpl.java:108)
JavaFX application launcher: calling System.exit
jfxsa-run:
BUILD SUCCESSFUL (total time: 5 seconds)
图书馆似乎都在正确的位置 - 无论如何,它们与第一个应用程序中的位置相同。可能是Netbeans应用程序框架在引擎盖下做了一些可怕的伏都教,但我真的不知道如何解决这个问题。
有谁知道为什么它似乎无法找到PU?
提前致谢! Luthien的
答案 0 :(得分:0)
错误来自JPA库本身,似乎没有正确配置JPA。问题似乎与持久性单元没有任何关系,JPA库似乎有问题,看起来它找不到它的服务文件资源。
也许删除eclipselink-javax.persistence-2.0.jar,如果你的服务器在其类路径上已经有JPA,则可能存在冲突。