2012-11-02 61 views
2

將項目jar文件導出到文件服務器後,jpa的entitymanager的創建不再起作用。使用EclipseLink和Java SE的JPA

還有就是以下細節:

  1. 我將EclipseLink從Glassfishv3項目
  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文件夾中。 (我用eclipse的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> 
    

整個事情的作品裏食,但不是從文件服務器的內容。 :-)

錯誤消息:

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(); 
+0

是否有堆棧跟蹤到錯誤? XMLException只是包裝的基本原因,所以應該有一個內部異常堆棧跟蹤,可能有助於指出問題 – Chris

+0

我添加了完整的堆棧跟蹤。請參閱上文。 –

+0

不確定有關錯誤消息,但您沒有指定數據庫連接信息... http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Configuration/JPA/persistence.xml – Puce

回答

1

很好地形成persistence.xml文件,因此誤差可能與一個錯誤的SAX解析器被稱爲作爲一個混亂的類路徑的結果。我的建議是仔細檢查你的應用程序類路徑,特別是檢查包含的jar是否包含重複和不兼容的SAX解析器。

+0

是的,你在哪裏。我混合了Glassfishv3和Glassfish3.1的東西。 –

0

假設你的一句「項目JAR文件導出到文件服務器後,」意味着你將項目部署到Glassfish的,在回答你的問題如下:

你的問題是,你正在創建一個EntityManager對於部署到glassfish的應用程序,其事務類型爲「資源本地」。您的應用程序 - 一旦部署在任何應用程序服務器(如GlassFish)中,實際上都由容器管理,並且它不再是SE的EE應用程序。要由容器管理的EntityManager必須具有JTA事務類型。

按照以下步驟或參考this Link或引用this Link設置您的JTA事務類型:

  1. 您的Sybase驅動程序的jar複製到文件夾:.. \ GlassFish的\域\ DOMAIN1 \ lib中
  2. 打開GlassFish管理控制檯
  3. 資源 - > JDBC - > JDBC連接池
  4. 推新按鈕
  5. 池名稱*:SybasePoolOfHasan
  6. 跳過資源類型現在
  7. 數據庫驅動程序供應商:的Sybase
  8. 按Next按鈕
  9. DataSource類名稱:com.sybase.jdbc3.jdbc。SybDriver
  10. 添加以下屬性:

    URL = JDBC:SYBASE:TDS: 「鍵入您的服務器名」: 「鍵入您的端口」

    用戶=鍵入

    密碼=鍵入

  11. 推送完成
  12. 推平 - > Ping成功
  13. 開放資源 - > JDBC - > JDBC資源
  14. JNDI名稱*:HasanSybaseJNDI
  15. 池名稱:SybasePoolOfHasan
  16. 按OK

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

    持久性單元名稱= 「QIS」 交易 - 類型= 「JTA」

    JTA - 數據 - 源> HasanSybaseJNDI

    重新部署和你被設置。

    雖然您必須修改您的代碼以失去任何事務處理。這意味着您的代碼中不再需要以下2行代碼:

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

    Glassfish應用服務器爲您處理交易!