Почему мы должны вручную промыть () Entitymanager в расширенном персистецеценте?

В нашем приложении J2EE мы используем гостевой боб EJB-3, чтобы позволить передний код создавать, изменять и сохранять постоянные объекты (управлять через JPA-2).

Это выглядит что-то подобное:

@LocalBean
@Stateful
@TransactionAttribute(TransactionAttributeType.NEVER)
public class MyEntityController implements Serializable
{   
    @PersistenceContext(type = PersistenceContextType.EXTENDED)
    private EntityManager em;

    private MyEntity current;

    public void create()
    {
        this.current = new MyEntity();
        em.persist(this.current);
    }

    public void load(Long id)
    {
        this.current = em.find(MyEntity.class, id);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void save()
    {
        em.flush();
    }
}

очень важно, чтобы избежать слишком ранних коммитов, только Save () метод () находится в транзакции, так что если мы звоним Создать () , мы ничего не вставляем в базу данных.

Любопытно, в методе Сохранить () , мы должны вызывать em.flush () , чтобы действительно ударить в базу данных. На самом деле, я попробовал и обнаружил, что мы также можем позвонить em.isopen () или Em.getFlushMode () , ну что-то, что является «EM-связанным».

Я не понимаю этот момент. AS Сохранить () находится в транзакции, я думал, что в конце метода транзакция будет предана, и поэтому постоянный менеджер сущности автоматически промыл. Почему я должен вручную промыть его?

Спасибо, Xavier

9
задан Xavier Portebois 1 September 2011 в 15:08
поделиться