Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Via annotation

Both lookup and injection of an EntityManagerFactory can be configured via the @PersistenceUnit annotation or <persistence-unit-ref> in xml. Annotations and xml have equal function in both lookup and injection.

Injection and Lookup

Via annotation

Code Block
titleUsable by EJB, Interceptor, Servlet, Filter, or Listener
package org.superbiz;

import javax.persistence.PersistenceUnit;
import javax.persistence.EntityManagerFactory;
import javax.ejb.Stateless;
import javax.naming.InitialUnit;

@Stateless
@PersistenceUnit(name = "myFooEntityManagerFactory", unitName = "foo-unit")
public class MyBean implements MyInterface {

    @PersistenceUnit(unitName = "bar-unit")
    private EntityManagerFactory myBarEntityManagerFactory;

    public void someBusinessMethod() throws Exception {
        if (myBarEntityManagerFactory == null) throw new NullPointerException("myBarEntityManagerFactory not injected");

        // Both can be looked up from JNDI as well
        InitialUnitInitialContext unit = new InitialUnitInitialContext();
        EntityManagerFactory fooEntityManagerFactory = (EntityManagerFactory) unit.lookup("java:comp/env/myFooEntityManagerFactory");
        EntityManagerFactory barEntityManagerFactory = (EntityManagerFactory) unitcontext.lookup("java:comp/env/org.superbiz.MyBean/myBarEntityManagerFactory");
    }
}

Via xml

The above @PersistenceUnit annotation usage is 100% equivalent to the following xml.

Code Block
xml
xml
titleejb-jar.xml or web.xml
<persistence-unit-ref>
    <persistence-unit-ref-name>myFooEntityManagerFactory<name>org.superbiz.calculator.MyBean/myBarEntityManagerFactory</persistence-unit-ref-name>
    <persistence-unit-name>fooname>bar-unit</persistence-unit-name>
    <persistence-unit-type>Transaction</persistence-unit-type>
</persistence-unit-ref>
<persistence-unit-ref>
    <injection-target>
        <persistence<injection-unittarget-ref-name>orgclass>org.superbiz.calculator.MyBeanMyBean</myBarEntityManagerFactory</persistenceinjection-unittarget-ref-name>class>
      <persistence  <injection-unittarget-name>bar-unit<name>myBarEntityManagerFactory</persistenceinjection-unittarget-name>
    <persistence-unit-type>Transaction<</injection-target>
</persistence-unit-type>
    <injection-target>ref>

Lookup only

Via annotation

Code Block
titleUsable by EJB, Interceptor, Servlet, Filter, or Listener

package org.superbiz;

import javax.persistence.PersistenceUnit;
import javax.persistence.EntityManagerFactory;
import javax.ejb.Stateless;
import javax.naming.InitialUnit;

@Stateless
@PersistenceUnit(name = "myFooEntityManagerFactory", unitName = "foo-unit")
public class MyBean implements MyInterface {

    public void someBusinessMethod() throws Exception {
        InitialContext context = new InitialContext();
        EntityManagerFactory fooEntityManagerFactory = (EntityManagerFactory) context.lookup("java:comp/env/myFooEntityManagerFactory");
    }
}

Via xml

The above @PersistenceUnit annotation usage is 100% equivalent to the following xml.

Code Block
xml
xml
titleejb-jar.xml or web.xml

<persistence-unit-ref><injection-target-class>org.superbiz.calculator.MyBean</injection-target-class>
    <persistence-unit-ref-name>myFooEntityManagerFactory</persistence-unit-ref-name>
    <injection<persistence-unit-targetname>foo-name>myBarEntityManagerFactory<unit</injectionpersistence-targetunit-name>
    </injection-target><persistence-unit-type>Transaction</persistence-unit-type>
</persistence-unit-ref>