2013-04-13 3 views
2

Мое приложение использует Hibernate как поставщик JPA и JBOSS 6.1.0-final как сервер. И транзакция CMT (тип транзакции в моем persistence.xml - JTA). Как показывает большинство руководств. транзакция в методе ejb будет автоматически зафиксирована, если она закончится без каких-либо исключений. Однако в моем приложении, если я не использую flush(), транзакция не будет выполнена, когда метод ejb завершится успешно (например, вставка записи никогда не вставляет данные в базу данных). Это тот же результат как в фазах без состояния, так и в состоянии stateful.EJB Транзакция не совершена, если не используется EntityManger # flush()

Я стараюсь использовать @TransactionAttribute(TransactionAttributeType.REQUIRED), но результат тоже тот же. Даже использование аннотации MANDATORY не вызывает никаких исключений, которые предполагают, что мой метод ejb использует транзакцию, управляемую контейнером.

Код Fragement:

@Stateful 
@Local 
public class TransactionTest implements ITransactionTest { 

    @PersistenceContext(unitName="Table") 
    private EntityManager manager; 

    public void generateRecord(int i) throws RuntimeException{ 
    Record record = new Record(); 
    record.setId(i+""); 
    record.setStatus(1); 
    manager.persist(record); 
    manager.flush(); //without this, it won't commit 
    } 
} 

Итак, почему мой метод EJB не может совершать сделки автоматически?

+0

Можете ли вы обновить свое сообщение соответствующим кодом. –

+0

Здесь я добавляю образец кода. – Kajelas

ответ

1

Состоящий из сеанса bean имеет PersistenceContextType.EXTENDED по умолчанию.

5.6.1.2 Контейнер управляемого Extended Постоянство Контекст

A Продолжительное контекст сохранения контейнера управляемого существует с точки , при котором управляемое контейнером диспетчера объектов, был получен путем инъекции зависимостей или через JNDI, пока он не будет закрыт контейнером . Такой расширенный контекст сохранения может быть инициирован только в рамках сеансового компонента с сохранением состояния и закрыт контейнером , когда завершается метод @Remove сеансового компонента состояния с состоянием (или экземпляр компонента состояния с состоянием в противном случае уничтожен).

Когда используется расширенный контекст сохранения, объекты , управляемые EntityManager, остаются управляемыми независимо от того, были ли начаты или совершенны транзакции JTA в . Они не становятся отсоединенными до тех пор, пока контекст сохранения не закончится.

  • Вы можете попробовать TransactionAttributeType.REQUIRES_NEW, поэтому фиксация вызывается после выхода из метода. Флеш автоматически вызывается перед фиксацией.

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

  • Если вы не хотите фиксировать изменения, & нужна разовая транзакция для распространения, тогда ваш текущий подход прекрасен & вызывать флеш явно.

+0

Большое спасибо. Я пробовал ваш метод, используя 'TransactionAttributeType.REQUIRES_NEW' и факсимильные элементы без учета. Но никто из них не работает. Есть ли еще какой-то момент, который нужно заметить? – Kajelas

+0

@ Kajelas Вы пытались (без гражданства + REQUIRES_NEW) или (stateful + REQUIRES_NEW). –