В нашем приложении 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