1 Reply Latest reply on Feb 25, 2006 4:17 PM by bill.burke

    Embedded EJB 3.0 & Eclipse problem

    bryanhunt

      I'm trying to run embedded EJB 3.0 as an eclipse plugin, and I'm having a problem with the EntityManager.

      Here is the setup:

      Plugin com.osc.core.ejb:

      I created a plugin project and copied the entire lib drectory from the EJB 3.0 embedded download into the root of that project. I added every jar file to the classpath in the runtime section of the MANIFEST.MF. I also exported every package. I also added:

      Eclipse-BuddyPolicy: registered

      to the MANIFEST.MF by hand

      Plugin com.osc.proto:

      I created a plugin and added com.osc.core.ejb as a dependency in the MANIFEST.MF. I copied the entire conf directory from the EJF 3.0 embedded download into the root of that project. I added the conf directory to the classpath in the runtime sectio of the MANIFEST.MF. I also added the buddy registry entry and "." to the classpath by hand so that I have:

      Eclipse-RegisterBuddy: com.osc.core.ejb
      Bundle-classPath: conf/,
      .

      in the MANIFEST.MF

      I created (in com.osc.proto) the following entity bean:

      package com.osc.proto;
      
      import java.io.Serializable;
      
      import javax.persistence.Basic;
      import javax.persistence.Entity;
      import javax.persistence.GeneratedValue;
      import javax.persistence.GenerationType;
      import javax.persistence.Id;
      import javax.persistence.Table;
      
      @Entity
      @Table(name="USERS")
      public class User implements Serializable
      {
       public int getId()
       {
       return id;
       }
      
       public void setId(int id)
       {
       this.id = id;
       }
      
       public String getName()
       {
       return name;
       }
      
       public void setName(String name)
       {
       this.name = name;
       }
      
       @Id
       @GeneratedValue(strategy=GenerationType.AUTO)
       private int id;
      
       @Basic
       private String name;
      
       private static final long serialVersionUID = -49617049545463116L;
      }
      
      


      I created the following platform runnable extension:

      
      package com.osc.proto;
      
      import javax.persistence.EntityManager;
      import javax.persistence.PersistenceContext;
      
      import org.eclipse.core.runtime.IPlatformRunnable;
      
      public class PlatformRunnable implements IPlatformRunnable
      {
       public Object run(Object args) throws Exception
       {
       System.out.println("Starting application");
       User user = new User();
       user.setName("Bryan");
       System.out.println("Persisting user");
       manager.persist(user);
      
       System.out.println("All done");
       return null;
       }
      
       @PersistenceContext(unitName="test")
       public EntityManager manager;
      }
      
      


      In the start method of the activator, I have:

      
       public void start(BundleContext context) throws Exception {
       super.start(context);
       System.out.println("Starting embedded EJB3");
       EJB3StandaloneBootstrap.boot(null);
       EJB3StandaloneBootstrap.scanClasspath();
      
       try
       {
       Persistence.createEntityManagerFactory("test");
       }
       catch (Exception e)
       {
       System.out.println(e);
       e.printStackTrace();
       }
       }
      
      


      I have the following persistence.xml in the META-INF folder of that plugin:

      <persistence>
       <persistence-unit name="test">
       <jta-data-source>java:/DefaultDS</jta-data-source>
       <properties>
       <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
       </properties>
       </persistence-unit>
      </persistence>
      


      When I run the platform runnable, I get the following exception when the activator starts and attempts to create the entity manager factory:

      Starting embedded EJB3
      WARN 25-02 10:03:38,190 (BeanSchemaBinding.java:init:227) -You should use the 2.0 version of the Microcontainer xml. xmlns='urn:jboss:bean-deployer:2.0'
      FATAL 25-02 10:03:40,368 (PersistenceXmlLoader.java:parsePersistenceUnit:101) -test JTA
      javax.persistence.PersistenceException: java.lang.NullPointerException
      javax.persistence.PersistenceException: java.lang.NullPointerException
      at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:173)
      at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:103)
      at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:37)
      at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:27)
      at com.osc.proto.Activator.start(Activator.java:36)
      at org.eclipse.osgi.framework.internal.core.BundleContextImpl$2.run(BundleContextImpl.java:994)
      at java.security.AccessController.doPrivileged(Native Method)
      at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:988)
      at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:969)
      at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:314)
      at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:256)
      at org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.preFindLocalClass(EclipseLazyStarter.java:83)
      at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:402)
      at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:186)
      at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:338)
      at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:390)
      at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:351)
      at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:81)
      at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
      at org.eclipse.osgi.framework.internal.core.BundleLoader.loadClass(BundleLoader.java:276)
      at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:227)
      at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1245)
      at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:138)
      at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:759)
      at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)
      at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:51)
      at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:95)
      at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)
      at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:374)
      at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:169)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.eclipse.core.launcher.Main.invokeFramework(Main.java:338)
      at org.eclipse.core.launcher.Main.basicRun(Main.java:282)
      at org.eclipse.core.launcher.Main.run(Main.java:977)
      at org.eclipse.core.launcher.Main.main(Main.java:952)
      Caused by: java.lang.NullPointerException
      at org.hibernate.ejb.packaging.PersistenceXmlLoader.deploy(PersistenceXmlLoader.java:68)
      at org.hibernate.ejb.Ejb3Configuration.createEntityManagerFactory(Ejb3Configuration.java:139)
      ... 38 more


      I tried following the simple tutorial bundled with the EJB 3.0 embedded download, and not create an entity manager factory, but when I tried to persist my entity bean with the EntityManager, I got a null pointer exception when calling manager.persist(user).

      I poked around and found a section in the hibernate docs that says you have to call createEntityManagerFactory() to bootstrap the entity manager. I added that call and that's where I get an exception.

      1. When using the EJB 3.0 embedded code, do I really have to call createEntitymanagerFactory()? Why doesn't the tutorial code do this?

      2. Why am I getting an exception when I call createEntityManagerFactory()?

      Bryan