JBoss - пользовательская транзакция не инициирована - PullRequest
1 голос
/ 08 февраля 2012

В следующем коде возникает исключение нулевого указателя, когда я пытаюсь вызвать метод beginTransaction.Я думал, что JBoss инициирует мою транзакцию ... очевидно, нет: \

Что мне не хватает?

JBoss 5.1.0.GA
JPA 1
JDK 6



import javax.annotation.Resource;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.transaction.UserTransaction;

public abstract class AbstractDAO {
    @PersistenceUnit(unitName = "miniDS")
    protected static EntityManagerFactory emf;
    @Resource
    protected UserTransaction t;

    public AbstractDAO() {

    }

    protected void beginTransaction() throws Throwable {
        t.begin();
    }

    protected void commitTransaction() throws Throwable {
        t.commit();
    }

    protected void rollbackTransaction() throws Throwable {
        t.rollback();
    }
}

Ответы [ 3 ]

3 голосов
/ 08 февраля 2012

Ваш AbstractDAO, похоже, не управляется. Инъекция работает только в управляемых контейнером объектах. Это относится не только к внедрению UserTransaction, но к внедрению в целом. В результате emf также будет нулевым. Спецификация Java EE перечисляет следующие классы, чтобы можно было использовать инъекцию:

  • Сервлет: сервлеты, фильтры сервлетов, прослушиватели событий
  • JSP: обработчики тегов, прослушиватели событий библиотеки тегов
  • JSF: управляемые bean-объекты в области видимости
  • JAX-WS: конечные точки службы, обработчики
  • EJB: бобы, перехватчики
  • Управляемые компоненты: управляемые компоненты
  • CDI: управляемые bean-компоненты в стиле CDI, декораторы
  • Платформа Java EE: основной класс (статический), обработчик обратного вызова для входа в систему

Возможный обходной путь - перенести внедрение ресурсов в управляемый класс или использовать поиск JNDI.

2 голосов
/ 08 февраля 2012

Ваш конкретный класс ConcreteDAO, который расширяет AbstractDAO, должен быть ejb, как сказал Микко Мауну, и должен сам управлять транзакцией (бинами, которые сами управляют транзакцией BMT), другими словами:

    @Stateless
    @TransactionManagement(TransactionManagementType.BEAN)
    public class ConcreteDAO extends AbstractDAO {

    ...

    }

И этобудет лучше, если вы добавите EntityManager в свой AbstractDAO и сконфигурируете источник данных JBOSS для управления транзакциями (local-tx-datasource или xa-datasource).вы можете посмотреть конфигурацию JBOSS DS по адресу: https://community.jboss.org/wiki/ConfigDataSources

, если вы хотите самостоятельно управлять транзакцией через EntityManager, с entityManagerFactory

  EntityManager entityManager = emf.createEntityManager();
  entityManager.getTransaction().begin();

вы не можете использовать UserTransaction, и JBoss DS долженbe no-tx-datasource

2 голосов
/ 08 февраля 2012

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

EntityManager entityManager = emf.createEntityManager();
entityManager.getTransaction().begin();

Для получения дополнительной информации посмотрите здесь: https://github.com/wicketstuff/core/wiki/How-to-use-@PersistenceUnit-annotation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...