我有一个使用容器管理的事务和容器传播的持久性上下文的 Java EE 6 Web 应用程序
@PersistenceContext
private EntityManager em;
在 JPA 层中,我有一个继承策略, whereMyExtendedClassA
和MyEntendedClassB
both extend abstract MyClass
。
我使用stateless
facade
服务类通过方法find
, findAll
, merge
, persist
,实现数据访问remove
:
@Stateless
public class MyExtendedClassAFacade {
@PersistenceContext
private EntityManager em;
public void persist(MyExtendedClassA a) {
// ...
}
// other methods
}
到现在为止还挺好。现在我必须对扩展类的行为实现多态性。这种行为包括管理数据库中的一些其他实体,因此需要 PersistenceContext(因此我需要使用其他Stateless
EJB):
@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);
}
}
}
有没有我可以用于这个目标的抽象模式?