2

After exporting the project jar file to the fileserver the creation of the entitymanager of jpa does not work anymore.

There is following details:

  1. I use EclipseLink from Glassfishv3 Project
  2. I downloaded EclipseLink 2.4... from the website.
  3. org.eclipse.persistence.core.jar, org.eclipse.persistence.jpa.jar, javax.persistence.jar and eclipselink.jar are in the lib folder.
  4. persistence.xml is in META-INF folder inside src. (I use eclipse helios)
  5. this is the content of the 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>
    

The whole thing works inside eclipse but not from the fileserver. :-)

Error message is:

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 is:

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();
Hasan Tuncay
  • 1,090
  • 2
  • 11
  • 30
  • Is there a stack trace to the error? The XMLException is just wrapping the underlying cause, so there should be an internal exception stack trace that might help point to the problem – Chris Nov 02 '12 at 13:47
  • I added complete stack trace. Please see above. – Hasan Tuncay Nov 02 '12 at 14:04
  • Not sure about the error message, but you didn't specify the DB connection info... http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Configuration/JPA/persistence.xml – Puce Nov 02 '12 at 13:49
  • yes i did. but not inside the persistence.xml. I did it when instanceing the entitymanager. I added it now to my request. See above. – Hasan Tuncay Nov 02 '12 at 14:01

2 Answers2

1

The persistence.xml file is well-formed so the error could be related to a wrong SAX parser being called as a result of a messed classpath. My advise is to carefully review your application classpath, especially checking if included jars contain duplicate and incompatible SAX parsers.

remigio
  • 4,101
  • 1
  • 26
  • 28
0

Assuming that your sentence "After exporting the project jar file to the fileserver" means that you deployed your project into Glassfish, the answer to your question is as follows:

Your problem is that you are creating an EntityManager whose transaction type is "resource-local" for an application that you deployed into glassfish. Your application - once deployed within any application server like GlassFish - is in fact managed by the container and it is an EE application not SE anymore. The EntityManager to be managed by the container has to have a JTA transaction type.

Follow these steps or refer to this Link or refer to this Link to setup your JTA transaction type:

  1. Copy your Sybase driver jar into the folder: ..\glassfish\domains\domain1\lib
  2. Open glassfish admin console
  3. Resources -> JDBC -> JDBC Connection Pools
  4. Push new button
  5. Pool name*: SybasePoolOfHasan
  6. Skip Resource type for now
  7. Database Driver Vendor: Sybase
  8. Push Next button
  9. DataSource class name: com.sybase.jdbc3.jdbc.SybDriver
  10. Add the following properties:

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

    User = type it

    Password = type it

  11. Push Finish
  12. Push Ping -> Ping succeeds
  13. Open Resources -> JDBC -> JDBC Resources
  14. JNDI Name*: HasanSybaseJNDI
  15. Pool name: SybasePoolOfHasan
  16. Push OK

    Back to your persistence.xml, modify it as follows:

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

    jta-data-source>HasanSybaseJNDI

    Redeploy and you are set.

    Although you have to modify your code as to lose any transaction handling. Meaning the following 2 lines are not needed in your code anymore:

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

    The Glassfish application server handles transactions for you!

Sym-Sym
  • 3,578
  • 1
  • 29
  • 30