EntityManager выдает исключение TransactionRequiredException при слиянии() в компоненте JBoss JSF

StackOverflow https://stackoverflow.com/questions/1084627

Вопрос

Я настроил приложение JSF на JBoss 5.0.1GA, чтобы представить список пользователей в таблице и разрешить удаление отдельных пользователей с помощью кнопки рядом с каждым пользователем.

Когда вызывается deleteUser, вызов передается UserDAOBean, который получает EntityManager, введенный из JBoss.

Я использую код

public void delete(E entity)
{
    em.remove(em.merge(entity));
}

чтобы удалить пользователя (код был c & p из руководства по JPA).Простой вызов em.remove(entity) не имеет никакого эффекта и по-прежнему вызывает то же исключение.

Когда эта строка достигнута, я получаю исключение TransactionRequiredException:

(пропуская явно неуместный stacktrace-материал)

...

20:38:06,406 ОШИБКА [[Сталкивается с сервлетом]] Servlet.service() для лиц сервлета Сервлет вызвал исключение javax.persistence.Исключение TransactionRequiredException:EntityManager должен быть доступен в рамках транзакции в org.jboss.jpa.deployment.ManagedEntityManagerFactory.verifyInTx(ManagedEntityManagerFactory.java:155) в org.jboss.jpa.tx.TransactionScopedEntityManager.merge(TransactionScopedEntityManager.java:192) в в.fhj.itm.utils.DAOImplTemplate.удалить (DAOImplTemplate.java:54) в в.fhj.itm.UserBean.delete(UserBean.java:53) в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный Способ)

...

Я уже пытался обернуть управляемую вручную транзакцию (em.getTransaction().begin() + .commit() ) вокруг нее, но это не удалось, потому что это запрещено в контейнере JBoss.С UserTransaction у меня тоже не было успеха.Поиски в Интернете по этой проблеме также не выявили аналогичного случая и решения.

Кто-нибудь сталкивался с чем-то подобным раньше и нашел решение этой проблемы?

Это было полезно?

Решение

Найдено недостающее звено.

Это действительно была отсутствующая транзакция, но решение состояло не в том, чтобы использовать EntityManager для ее обработки, а в добавлении введенной UserTransaction .

@Resource
UserTransaction ut;
...
public void delete(E entity)
{
        ut.begin();
        em.remove(em.merge(entity));
        ut.commit();
}

Спасибо всем предложениям, которые каким-то образом из более чем 100 углов приводят к этому решению.

Другие советы

Знаю, что это старый вопрос, но на всякий случай, если кто-нибудь наткнется на это, как я.

Попробуй

em.joinTransaction();
em.remove(bean);
em.flush();

Это то, что мы используем во всех наших компонентах @Stateful.

Если вы используете Seam, вы также можете использовать @Transactional(TransactionPropagationType.REQUIRED) аннотация.

Вы уверены, что аннотировали свой bean с помощью @Stateless или зарегистрировали его с помощью xml?

Попробуйте добавить аннотацию транзакции к вашему коду, это может помочь вам:

@TransactionAttribute(REQUIRED)
public void delete(E entity)
{
        em.remove(em.merge(entity));
}

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

просто записка:мы столкнулись с этой же проблемой сегодня, оказалось, что кто-то пометил EJB как TransactionAttributeType.NOT_SUPPORTED, а метод как TransactionAttributeType .ТРЕБУЕТСЯ, что приводит к сбою em.merge из-за отсутствия транзакции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top