Почему сущность не может быть найдена, если я отошел после упорства - PullRequest
1 голос
/ 04 октября 2011

У меня есть сеансный компонент без сохранения состояния с транзакциями, управляемыми контейнером.Я хочу вернуть неуправляемую сущность после создания (сохранения) ее в базе данных.Вот как я это делаю:

@Stateless
public class MyBean {

   @EJB(name="MyController")
   private MyController myController;

   public MyEntity create(MyEntity entity) {
      //...
      myController.create(entity);
      myController.preTransfer(entity);
      return entity;
   }
}
@Stateless
public class MyController {

   @PersistenceContext(unitName = "myPU")
   private EntityManager em;

   public void create(MyEntity entity) {
      //...
      em.persist(entity);
   }

   public void preTransfer(MyEntity entity) {
       if (em.contains(entity)) {
           em.detach(entity);
       }
       //...
   }
}

Я звоню MyBean.create , сущность успешно сохранена и MyBean.create возвращает неуправляемую сущность, это нормально.Но в следующий раз, когда я пытаюсь получить эту сущность по идентификатору, она не может быть найдена.Если я прокомментирую detach , сущность может быть найдена, но MyBean.create вернет управляемый объект в этом случае.Где я не прав?

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Javadoc EntityManager.detach заявляет:

Незавершенные изменения, внесенные в сущность, если таковые имеются (включая удаление лицо), не будет синхронизироваться с базой данных

Итак, вы сохраняете это, затем отсоединяете это. Но операции, связанные с сохранением, еще не сброшены, и, следовательно, объект не сохраняется в базе данных.

Почему вы хотите отсоединить его? Как только транзакция будет завершена, она будет автоматически отключена.

0 голосов
/ 05 октября 2011

Изменение ответа JB: вы также можете использовать чистый стандартный механизм, не заставляя контейнер явно отсоединяться или очищаться:

@Stateless
public class MyController {

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public MyEntity create(MyEntity entity) {
       //...
       em.persist(entity);
       return entity;
    }
}

В результате вы получите отсоединенную сущность.

...