Во-первых, у меня есть bean-компонент без состояния, который выполняет простое ретривирование, выглядящее так
@Stateless
@LocalBean
public A {
@PersistenceContext
private EntityManager em;
public MyEntity retrieveMethod(){
em.createQuery(...).getSingleResult();
}
}
У меня есть компонент statefull, используемый для управления длинным разговором с удаленным клиентом, он выглядит следующим образом:
@Statefull
@LocalBean
@TransactionAttribute(NOT_SUPPORTED)
public class B implements BRemote {
@PersistenceContext(type = EXTENDED)
private EntityManager em;
@EJB
A a;
public void start(){
OtherEntity oe = new OtherEntity();
oe.setRelationMyEntitie(this.a.retrieveMethod());
em.persist(oe);
}
@TransactionAttribute(REQUIRED)
public void end(){
em.flush();
}
}
Проблема возникает при запуске em.persist (oe). oe имеет ссылку на экземпляр MyEntity, который был загружен другим EntityManager. Так что они не знают, что жалуются на сохранение отстраненной сущности.
Хотелось бы узнать, как существует способ избежать этой проблемы. Если нет прямого решения, какой шаблон лучше выбрать?
РЕДАКТИРОВАТЬ: я не хочу использовать транзакцию на start (), потому что в реальном приложении, компонент statefull используется для реализации сложной модели сущностей, которая должна сохраняться сразу. Я пытаюсь настроить шаблон, называемый сеанс на разговор, описанный здесь http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/transactions.html#transactions-basics-apptx. Так что, если я вас правильно понимаю, решение состоит в том, чтобы «использовать транзакцию в методе start () компонента B», но если я это сделаю это, в конце метода, содержимое сбрасывается в базу данных, и это не то, что я хочу.
Другое решение, которое я вижу, состоит в том, чтобы получить MyEntity в EntityManager B, так что сделайте слияние или em.find () или делегируйте retrieveMethod некоторому классу стиля DAO, используя параметр em в параметре и в bean-компоненте A, сделайте простое делегирование в DAO, в бине B, вызовите непосредственно DAO.
Есть идеи, как лучше всего подходить?