JPA-Vererbung und EJB-Polymorphismus

Ich habe eine Java EE 6-Webanwendung, die containergesteuerte Transaktionen und den containerpropagierten Persistenzkontext verwendet

@PersistenceContext
private EntityManager em;

In der JPA-Ebene habe ich eine Vererbungsstrategie, woMyExtendedClassA undMyEntendedClassB beide verlängernabstract MyClass.

ich benutzestateless facade Serviceklassen zur Implementierung des Datenzugriffs über die Methodenfind, findAll, merge, persist, remove:

@Stateless
public class MyExtendedClassAFacade {
    @PersistenceContext
    private EntityManager em;
    public void persist(MyExtendedClassA a) {
        // ...
    }
    // other methods
}

So weit, ist es gut. Jetzt muss ich einen Polymorphismus auf die implementierenVerhalten der erweiterten Klassen. Dieses Verhalten besteht darin, einige andere Entitäten in der Datenbank zu verwalten. Daher wird der PersistenceContext benötigt (und daher muss ich einen anderen verwendenStateless EJBs):

@Stateful
public class MyBean {

    @EJB
    private MyClassFacade myClassFacade;   // stateless facade service class

    public void doSomething() {
        for (MyClass c : myClassFacade.findAll()) {
            // here I need to perform operations on the db. 
            // The implementation differs on each extended class.
            // I want to avoid a brute-force coding like:
            if (c.getClass().equals(MyExtendedClassA.class)) {
                @EJB MyExtendedClassAFacade myClassFacadeA;
                myClassFacadeA.doSomething((MyExtendedClassA) c);
            } else if (c.getClass().equals(MyExtendedClassB.class))
                @EJB MyExtendedClassBFacade myClassFacadeB;
                myClassFacadeB.doSomething((MyExtendedClassB) c);
            }
            // Instead, I would like to write something like:
            @EJB AnotherStatelessBean asb;
            asb.doSomething(c);
        }
    }
}

Gibt es ein Abstraktionsmuster, das ich für dieses Ziel verwenden kann?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage