【问题标题】:JPA createEntityManagerFactory "Unknown Source" error (non-J2EE)JPA createEntityManagerFactory“未知来源”错误(非J2EE)
【发布时间】:2012-03-17 01:03:04
【问题描述】:

我找不到问题所在:许多人似乎在使用 PU 名称创建 EntityManagerFactory 时遇到问题。但是我已经检查了所有建议,到目前为止没有任何帮助。 我正在尝试构建我的第一个 JavaFX2 应用程序。它是一个小型字典应用程序,最初建立在 Netbeans Application 框架上(通过扩展默认的“Master-Detail”生成的类)。它使用 SQLite 数据库。

我现在将它从那里移植到另一个(启用 JavaFX2)项目。我首先着手在新应用程序中重建 JPA 持久性内容。据我所见,我已经准备好了所有内容:META-INF/persistence.xml,其中声明了所有必要的实体类,使用与原始应用程序相同的数据库连接。

我添加了 eclipselink-2.3.0.jar; eclipselink-javax.persistence-2.0.jareclipselink-jpa-modelgen-2.3.0.jar 到项目中。

我使用一个简单的 Properties 类代替了 Application Context 来保存以前在 .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 的原因吗?

提前致谢! 卢锡安

【问题讨论】:

    标签: jpa eclipselink javafx-2 netbeans-7.1


    【解决方案1】:

    JPA 库本身出现错误,似乎 JPA 配置不正确。该问题似乎与持久化单元无关,JPA 库似乎有问题,似乎找不到它的服务文件资源。

    也许删除 eclipselink-javax.persistence-2.0.jar,如果您的服务器在其类路径上已经有 JPA,则可能存在冲突。

    【讨论】:

    • 您好,谢谢您的回答。我看了一下,但我无法从项目中删除 eclipselink-javax.persistence-2.0.jar:它是一个桌面应用程序(不是 Web 应用程序),所以实体 bean 需要那个库。除了通过 persistence.xml 之外,我还可以通过哪些方式编辑 JPA?据我所见,设置与我在非 JavaFX 项目中的设置完全相同 - 并且工作正常。
    • 我解决了 - 问题显然是我首先将 JPA 库复制到新项目中,然后创建了实体类。显然——而我只是没有意识到——创建实体类也会将这些库添加到项目中,并且在除persistence.xml 或manifest.mf 之外的黑暗和隐藏的地方做一些配置巫术或你有什么。创建一个新项目并首先生成(和编辑)实体类解决了这个问题。
    猜你喜欢
    • 2013-01-30
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    相关资源
    最近更新 更多