Рассмотрим следующий сценарий:
@Stateless
public class A{
@PersistenceContext
private EntityManager em;
@EJB
B b;
@EJB
C c;
public void doSomeWork(){
b.doSomeWork();
c.doSomeWork();
em.persist(someStuff);
}
}
@Stateless
public class B{
@PersistenceContext
private EntityManager em;
public void doSomeWork(){
//Do stuff
em.persist(stuff)
}
}
@Stateless
public class C{
@PersistenceContext
private EntityManager em;
public void doSomeWork(){
//Do stuff
em.persist(stuff)
}
}
В этом сценарии я использую три разных EntityManager для одной и той же транзакции (запущено методом doSomeWork()
из class A
Теперь та же транзакция, но только с одним EntityManager:
@Stateless
public class A{
@PersistenceContext
private EntityManager em;
@EJB
B b;
@EJB
C c;
public void doSomeWork(){
b.setTheEntityManager(em);
b.doSomeWork();
c.setTheEntityManager(em);
c.doSomeWork();
em.persist(someStuff);
}
}
@Stateless
public class B{
private EntityManager em;
public void setTheEntityManager(EntityManager em){
this.em = em;
}
public void doSomeWork(){
//Do stuff
em.persist(stuff)
}
}
@Stateless
public class C{
private EntityManager em;
public void setTheEntityManager(EntityManager em){
this.em = em;
}
public void doSomeWork(){
//Do stuff
em.persist(stuff)
}
}
Я читал о жизненном цикле EntityManager, но я просто не могу понять, есть ли какие-либо преимущества (с точки зрения производительности, подключений к базе данных, ..) в Второй сценарий. Мой первый ответ - да, потому что существует только один EntityManager, но, с другой стороны, я не вижу никаких примеров кода, использующих этот подход (передача EntityManager из EJB в EJB). Кроме того, в Oracle Документах говорится: « Благодаря автоматическому распространению контекста постоянства компоненты приложения не должны передавать друг другу ссылки на экземпляры EntityManager, чтобы вносить изменения в рамках одной транзакции. Контейнер Java EE управляет жизненным циклом диспетчеров объектов, управляемых контейнером. "