объявить транзакцию в ejb 3.0 - PullRequest
2 голосов
/ 15 сентября 2010

как заставить EJB не сбрасывать все после каждой команды, я хочу сделать транзакцию.Я читал, что это сделано как-то декларативно.А как именно? @Stateless public class SomeBean{ @PersistenceContext EntityManager em; public void doSomeStuffAndThenFlushToTheDb(){ em.persist(entity); // it's flushed by now, I don't want that em.persist(somethingElse); // now I want to flush both em.flush(); } }

Ответы [ 2 ]

0 голосов
/ 21 сентября 2013

Прежде всего, «очистить» означает хранить в нем только кэш второго уровня (драйвер БД). Он не хранится непосредственно в БД. Сущность хранится в кэше, поскольку транзакция завершена и отправлено подтверждение. «Очистить» означает отделить сущность. Это не значит очистить базу данных. Поэтому после этого вы не сможете больше сохранять эту сущность. Но упорство все равно будет выполнено в конце транзакции.

0 голосов
/ 15 сентября 2010

Привет, как я могу заставить EJB не очищать все после каждой команды, я хочу сделать транзакцию.

Прежде всего, вы не должны получать flush после «каждой отдельной команды» , и я действительно удивлен, что вы получаете flush после persist. Вы показываете весь код? Во-вторых, методы EJB обрабатываются по умолчанию. Но транзакция и flush на самом деле не связаны (единственная ссылка заключается в том, что flush будет выполнено до commit). Во всяком случае ...

Если вы хотите контролировать способ выполнения вызова flush(), вы можете изменить режим сброса по умолчанию, используя EntityManager#setFlushMode(). Режимы сброса следующие:

  • COMMIT - Сброс происходит только при фиксации транзакции или при вызове flush ().
  • AUTO - (по умолчанию) Сброс происходит перед выполнением любого запроса.

Так что-то подобное должно работать:

@Stateless
public class SomeBean {
    ...
    public void doSomeStuffAndThenFlushToTheDb(){
        em.setFlushMode(COMMIT);
        em.persist(entity);
        em.persist(somethingElse);
        em.flush(); // Causes flush
    }
    ...
}

Но, как я уже сказал, я удивлен вашим примером. Поведение, которое вы описываете, не то, что я ожидал.

...