繁体   English   中英

带有EclipseLink和Java SE的JPA

[英]JPA with EclipseLink and Java SE

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

有以下详细信息:

  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文件夹中。 (我使用日食日光灯)
  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();

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

假设您的句子“将项目jar文件导出到文件服务器之后”意味着您将项目部署到了​​Glassfish中,那么问题的答案如下:

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

请按照以下步骤操作,或参考此链接或参考此链接来设置您的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:“输入您的服务器名称”:“输入您的端口”

    用户=输入

    密码=输入

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

    返回您的persistence.xml,如下修改:

    持久性单元名称=“ QIS”,事务类型=“ JTA”

    JTA数据源> HasanSybaseJNDI

    重新部署,您就定了。

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

    em.getTransaction()()开始。 em.getTransaction()提交();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM