persistence@glassfish.java.net

issues using toplink-essentials v2-b35 in eclipse RCP plugin application

From: sud <to_sud_at_yahoo.com>
Date: Fri, 9 Feb 2007 05:54:51 -0800 (PST)

I've looked at bug #1502 and this issue appears to be different from that. Besides, this one still shows up in Version 2 build 35. I'm successfully able to test the JPA code in my Eclipse plugin project using TestNG tests. I've verified that the persistence.xml file gets copied over to the bin/ directory correctly when the project is built. When I launch the same plugin as a plugin into my existing Eclipse RCP application from within my eclipse workbench I get the following error message: javax.persistence.PersistenceException: No Persistence provider for EntityManager named mydata at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:89) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60) I debugged the issue to the findAllProviders() in the Persistence.java class. private static void findAllProviders() throws IOException { ClassLoader loader = Thread.currentThread().getContextClassLoader(); Enumeration<URL> resources = loader.getResources("META-INF/services/" + PersistenceProvider.class.getName()); Set<String> names = new HashSet<String>(); while (resources.hasMoreElements()) { URL url = resources.nextElement(); InputStream is = url.openStream(); try { names.addAll(providerNamesFromReader(new BufferedReader(new InputStreamReader(is)))); } finally { is.close(); } } for (String s : names) { try{ providers.add((PersistenceProvider)loader.loadClass(s).newInstance()); } catch (ClassNotFoundException exc){ } catch (InstantiationException exc){ } catch (IllegalAccessException exc){ } } } The problem was in the JavaSECMPInitializer.java class which is getting called in the providers,add() method as shown above. The emSetupImpls object in JavaSECMPInitializer.java is null. The callPredeploy method (which I believe is responsible to populate this object) in this class is not being called at any point during my code execution. So I added the following vmargs to my application launch configuration: -javaagent:D:\java\workspaces\RCPworkspace\reqlibs\toplink-essentials-agent.jar This time around I get a different error message when execution reaches the names.addAll() method as shown above. (Notice that this before the line where the previous error message was occuring) java.lang.ClassCastException: oracle.toplink.essentials.PersistenceProvider cannot be cast to javax.persistence.spi.PersistenceProvider at javax.persistence.Persistence.findAllProviders(Persistence.java:112) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:60) When I refactor the data access layer into a separate java project and jar it add it to my plugin's dependency project all works fine. This would work in a production setting but is not ideal in a development environment where we have to constantly change data access code. At this point I'm lost and I'd appreciate any help getting this to work. Thanks -sud Bored stiff? Loosen up... Download and play hundreds of games for free on Yahoo! Games. ____________________________________________________________________________________ Get your own web address. Have a HUGE year through Yahoo! Small Business. http://smallbusiness.yahoo.com/domains/?p=BESTDEAL