【问题标题】:JPA with EclipseLink and Java SE带有 EclipseLink 和 Java SE 的 JPA
【发布时间】:2012-11-02 13:35:46
【问题描述】:

将项目jar文件导出到文件服务器后,jpa的实体管理器的创建不再起作用。

有以下细节:

  1. 我使用 Glassfishv3 项目中的 EclipseLink
  2. 我从网站下载了 EclipseLink 2.4...。
  3. org.eclipse.persistence.core.jar、org.eclipse.persistence.jpa.jar、javax.persistence.jar 和 eclipselink.jar 在 lib 文件夹中。
  4. persistence.xml 位于 src 内的 META-INF 文件夹中。 (我使用日食 helios)
  5. 这是persistence.xml的内容

    <?xml version="1.0" encoding="UTF-8"?>
    <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" 
        version="2.0" 
        xmlns="http://java.sun.com/xml/ns/persistence">
        <persistence-unit name="QIS" transaction-type="RESOURCE_LOCAL" >
            <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
            <class>com.quoka.qis.lib.persistence.Type</class>
        </persistence-unit>
    </persistence>
    

整个事情在 Eclipse 中工作,但不是来自文件服务器。 :-)

错误信息是:

org.eclipse.persistence.internal.jpa.deployment.xml.parser.XMLException
    URI was not reported to parser for entity [document])
Caused By:
Log Exception of type org.eclipse.persistence.internal.jpa.deployment.xml.parser.XMLException : 
(1. URI was not reported to parser for entity [document])
(0) org.eclipse.persistence.internal.jpa.deployment.xml.parser.XMLExceptionHandler.error(XMLExceptionHandler.java:28)
(1) org.eclipse.persistence.internal.jpa.deployment.xml.parser.XMLExceptionHandler.warning(XMLExceptionHandler.java:23)
(2) gnu.xml.aelfred2.SAXDriver.warn(SAXDriver.java:935)
(3) gnu.xml.aelfred2.SAXDriver.startExternalEntity(SAXDriver.java:631)
(4) gnu.xml.aelfred2.XmlParser.pushURL(XmlParser.java:3358)
(5) gnu.xml.aelfred2.XmlParser.doParse(XmlParser.java:159)
(6) gnu.xml.aelfred2.SAXDriver.parse(SAXDriver.java:320)
(7) gnu.xml.aelfred2.XmlReader.parse(XmlReader.java:294)
(8) org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceXML(PersistenceUnitProcessor.java:442)
(9) org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceArchive(PersistenceUnitProcessor.java:401)
(10) org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.getPersistenceUnits(PersistenceUnitProcessor.java:310)
(11) org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.findPersistenceUnitInfoInArchive(JPAInitializer.java:149)
(12) org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.findPersistenceUnitInfoInArchives(JPAInitializer.java:136)
(13) org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.findPersistenceUnitInfo(JPAInitializer.java:125)
(14) org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:98)
(15) org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:65)
(16) javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:78)
(17) com.quoka.qis.admin.QisAdminEntityManager.getInstance(QisAdminEntityManager.java:33)
(18) com.quoka.qis.admin.QisAdminFrame.login(QisAdminFrame.java:574)
(19) com.quoka.qis.admin.QisAdminFrame.testLogin(QisAdminFrame.java:513)
(20) com.quoka.qis.admin.QisAdminFrame.showFrame(QisAdminFrame.java:441)
(21) com.quoka.qis.admin.QisAdminFrame.showFrame(QisAdminFrame.java:417)
(22) com.quoka.qis.admin.QisAdminFrame.access$3(QisAdminFrame.java:416)
(23) com.quoka.qis.admin.QisAdminFrame$DebugPanel.run(QisAdminFrame.java:777)
(24) java.lang.Thread.run(Thread.java:662)

DBConnection 是:

Map<String, String> properties = new HashMap<String, String>();
properties.put("javax.persistence.jdbc.driver", "com.sybase.jdbc3.jdbc.SybDriver");
properties.put("eclipselink.target-database", "Sybase");
properties.put("javax.persistence.jdbc.url", "jdbc:sybase:Tds:"+meta.getServerName()+":"+meta.getPort());
properties.put("javax.persistence.jdbc.user", meta.getUserName());
properties.put("javax.persistence.jdbc.password", meta.getPassword());
properties.put("eclipselink.logging.level", "INFO"); 

EntityManagerFactory emf = Persistence.createEntityManagerFactory("QIS", properties);
em = emf.createEntityManager();

【问题讨论】:

  • 是否有错误的堆栈跟踪? XMLException 只是包装了根本原因,因此应该有一个内部异常堆栈跟踪可能有助于指出问题
  • 不确定错误信息,但您没有指定数据库连接信息...wiki.eclipse.org/EclipseLink/UserGuide/JPA/…
  • 是的,我做到了。但不在persistence.xml 中。我在实例化实体管理器时做到了。我现在将它添加到我的请求中。见上文。
  • 我添加了完整的堆栈跟踪。请参见上文。

标签: java jpa eclipselink


【解决方案1】:

persistence.xml 文件格式正确,因此该错误可能与由于类路径混乱而调用了错误的 SAX 解析器有关。我的建议是仔细检查您的应用程序类路径,特别是检查包含的 jar 是否包含重复且不兼容的 SAX 解析器。

【讨论】:

  • 是的,你在哪里对。我混合了 Glassfishv3 和 Glassfish3.1 的东西。
【解决方案2】:

假设你这句话“将项目jar文件导出到文件服务器后”表示你将项目部署到Glassfish中,那么你的问题的答案如下:

您的问题是您正在为部署到 glassfish 中的应用程序创建一个事务类型为“资源本地”的 EntityManager。您的应用程序 - 一旦部署在 GlassFish 等任何应用程序服务器中 - 实际上由容器管理,它不再是一个 EE 应用程序,而不是 SE。由容器管理的EntityManager必须有JTA事务类型。

按照这些步骤或参考this Link 或参考this Link 来设置您的JTA 事务类型:

  1. 将 Sybase 驱动程序 jar 复制到文件夹中:..\glassfish\domains\domain1\lib
  2. 打开 glassfish 管理控制台
  3. 资源 -> JDBC -> JDBC 连接池
  4. 按下新按钮
  5. 池名称*:SybasePoolOfHasan
  6. 暂时跳过资源类型
  7. 数据库驱动供应商:Sybase
  8. 按下下一步按钮
  9. 数据源类名:com.sybase.jdbc3.jdbc.SybDriver
  10. 添加以下属性:

    URL= jdbc:sybase:Tds:"type your ServerName":"type your Port"

    用户 = 输入它

    密码 = 输入

  11. 推完
  12. 推送 Ping -> Ping 成功
  13. 打开资源 -> JDBC -> JDBC 资源
  14. JNDI 名称*:HasanSybaseJNDI
  15. 池名称:SybasePoolOfHasan
  16. 按下确定

    回到你的persistence.xml,修改如下:

    persistence-unit name="QIS" transaction-type="JTA"

    jta-data-source>HasanSybaseJNDI

    重新部署,一切就绪。

    尽管您必须修改代码以丢失任何事务处理。这意味着您的代码中不再需要以下 2 行:

    em.getTransaction().begin(); em.getTransaction().commit();

    Glassfish 应用服务器为您处理事务!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2016-08-22
    相关资源
    最近更新 更多