persistence@glassfish.java.net

best practice for generic facade?

From: Gary Jacobson <gtjacobson_at_gmail.com>
Date: Thu, 7 May 2009 17:18:26 +0200

Hi

I have a question regarding the "best practice" for using multiple stateless
session beans to manage my entities. All of my entities extend
GenericEntity, and need to have some database operations performed before
being persisted or merged. Below is a snippet from my GenericEntityFacade:

@Stateless
public class GenericEntityFacade implements GenericEntityFacadeLocal
{
    @PersistenceContext
    EntityManager em;

    public void create( GenericEntity ge )
    {
        em.createQuery( .... generic stuff ....
        em.persist( ge );
    }
}

I have many other facades for managing various entities, e.g. SaleFacade for
Sales. My question is, what is the best way to get the other facades to
utilize the GenericEntityFacade?

* Option 1: embed GenericEntityFacade and EntityManager*

@Stateless
public class SaleFacade implements SaleFacadeLocal
{
    @PersistenceContext
    EntityManager em;

    @EJB
    private GenericEntityFacadeLocal genericEntityFacade;

    public void createSale( Sale sale )
    {
        em.createQuery( .... sale stuff ....
        genericEntityFacade.create( sale );
    }
}

* Option 2: embed GenericEntityFacade and use its EntityManager*

@Stateless
public class SaleFacade implements SaleFacadeLocal
{
    @EJB
    private GenericEntityFacadeLocal genericEntityFacade;

    public void createSale( Sale sale )
    {
        genericEntityFacade.getEntityManager().createQuery( .... sale stuff
....
        genericEntityFacade.create( sale );
    }
}

* Option 3: extend GenericEntityFacade** and use the inherited EntityManager
*

@Stateless
public class SaleFacade extends GenericEntityFacade implements
SaleFacadeLocal
{
    public void createSale( Sale sale )
    {
        em.createQuery( .... sale stuff ....
        genericEntityFacade.create( sale );
    }
}

I'm currently using option 3. Any other recommendations or advice would be
welcome!

Thanks
Gary