JPA EntityManager.flu sh () не вызывается контейнером java / jakarta EE - PullRequest
1 голос
/ 05 августа 2020

JPA EntityManager.flu sh () не вызывается из контейнера glassfi sh 5.1 EE.

В среде Java SE:

EntityTransaction t = em.getTransaction();
t.begin();

// persist entities
em.persist(entity);

t.commit();

commit () будет flu sh сущности в контексте персистентности.

Java EE среда, например Glassfi sh:

@Stateless
public class DataManagerBean {
    @PersistenceContext
    EntityManager em;

    public void persist(Object entity) {
        em.persist(entity);
    }
}

JSF Bean:

@Named
@ViewScoped
public class FooBean  {
    @EJB
    DataManagerBean dataManagerBean;
    
    public void createFoo() {
        dataManagerBean.persist(foo);       
    }
} 

Приложение не может вызовите em.getTransaction (). Транзакция управляется контейнером. Поставщик JPA entityManager.flu sh () не вызывается до вызова entityManager.close (). В результате объект не создается в базе данных.

В среде EE соединение с базой данных, полученное поставщиком JPA EntityManager, совпадает с тем, которое используется контейнером?

Как контейнер EE сообщает JPA провайдер для гриппа sh сущностей для сохранения, если грипп sh () не вызывается?

1 Ответ

0 голосов
/ 06 августа 2020

Это зависит от того, как вы называете свой бизнес-метод. Одним словом, по умолчанию - транзакция начинается, когда ваш поток входит в ПЕРВЫЙ бизнес-метод (или перехватчик, украшающий ваш первый бизнес-метод), и заканчивается, когда ваш поток оставляет последний бизнес-метод в стеке (или перехватчик, украшающий ваш первый бизнес-метод).

Вы можете управлять транзакциями, используя аннотацию @ TransactionAttribute с соответствующим TransactionAttributeType (ОБЯЗАТЕЛЬНО по умолчанию, если не аннотировано). Например:

@Stateless
public class DataManagerBean {
    @PersistenceContext
    EntityManager em;

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void persist(Object entity) {
        em.persist(entity);
    }
}

В этом случае вызов DataManagerBean.persist запускает новую транзакцию и фиксирует, а flu sh изменяется при выходе. В случае ошибки он откатит транзакцию и выдаст исключение, которое вы можете поймать при вызове бизнес-метода.

...