2009-11-24 3 views
6

Что лучше всего использовать для использования транзакций базы данных с помощью шва при использовании EJB - т.е. при развертывании Seam как WAR?Ручные операции с швом POJO

По умолчанию Seam JavaBeans поддерживает транзакции. Я могу аннотировать метод с @Transactional, который обеспечит транзакцию. Или я могу использовать @Transactional (НИКОГДА) или @Transactional (MANDATORY). Я не могу понять, как это сделать: создать свою собственную транзакцию, установить тайм-аут, начать, а затем совершить/откат.

Я попытался с помощью:

UserTransaction utx = Transaction.instance(); 
utx.setTransactionTimeout(2000); 
utx.begin(); 

Но он либо игнорируется, если транзакция уже выполняется или возвращает javax.transaction.NotSupportedException если я аннотирования метод с @Transactional (NEVER)

Любая помощь приветствуется. Благодарю.

+0

дать полное имя @Transactional – Bozho

+0

org.jboss.seam.annotations.Transactional – Damo

ответ

8

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

Если вы используете JTA UserTransaction в среде, отличной от EJB, то JTA доступен (Apache Tomcat не поддерживает JTA).

1 ° правило

управление Швом транзакций включено по умолчанию для всех запросов JSF (пласты 2.0+).

Я думаю, что управление сделки Шва звучит лучше, как Транзакции, управляемые Seam. Это означает, что Шейм берет на себя заботы, за кулисами, призывать начать и совершить. Шов играет роль менеджера транзакций с помощью диспетчера транзакций Шва

1 ° Сценарий: POJO + JTA имеющаяся (Apache Tomcat не поддерживает JTA) Менеджер

транзакций, используемые пласты: org.jboss.seam .transaction.UTtransaction

включена по умолчанию в не EJB среде (войны), когда JTA доступны (JBoss поддержка JTA)

Если вы используете JPA EntityManager или Hibernate Session, вы должны зарегистрировать их позволяет управлять Шов границы транзакций

См 9.3. Seam-managed persistence contexts как настроить Шов удался контекст сохранения (вводимый с помощью @in)

Затем впрыскивают EntityManager (EntityManager) или сессии (спящий режим) с помощью @in (контекстного к ScopeType.РАЗГОВОРА)

@Name("businessService") 
public class BusinessServiceImpl implementes BusinessService { 

    @In 
    private EntityManager entityManager; 

    public void doSomething() { 
     // You do not need to call entityManager().getTransaction().begin(); 
     // because Seam Transaction Manager takes care of it 
     // By using proxies 
     // Therefore, if you call entityManager().getTransaction().begin() 
     // You will get IllegalStateException 

     // Some EntityManager operations persist, find etc 

     // You do not need to call entityManager().getTransaction().commit(); 
     // because Seam Transaction Manager takes care of it 
     // By using proxies 
    } 

} 

За кулисами Шов Менеджер транзакций Завербуйте EntityManager (JPA) или сессии (спящий режим) в активном JTA UserTransaction, путем вызова joinTransaction метод

2 ° сценарий: POJO + RESOURCE_LOCAL (либо Hibernate или JPA) Transaction

Менеджер транзакций используется Шов (JPA): org.jboss.seam.transaction.EntityTransaction

Transa фикция менеджер используется Seam (Hibernate): org.jboss.seam.transaction.HibernateTransaction

См 9.3. Seam-managed persistence contexts как настроить Шов удался контекст сохранения (вводимый с помощью @in)

За кулисы, Seam сделка Менеджер заботится о вызове начать и совершить в базовой технологии с использованием прокси

3 ° сценарных: EJB

Менеджер транзакций используются пласты: org.jboss.seam.transaction.CMTTransaction

Включено по умолчанию в среде EJB. Будьте осторожны, в этом случае Seam не контролирует транзакции, управляемые контейнером.

С уважением,

5

Путь я в настоящее время работает как это:

//don't use @Transactional annotation 
public void doStuff() { 
    UserTransaction userTx = (UserTransaction) org.jboss.seam.Component.getInstance("org.jboss.seam.transaction.transaction"); 
    userTx.setTransactionTimeout(10 * 60); //set timeout to 60 * 10 = 600 secs = 10 mins 
    userTx.begin(); 

    /*If entity manager is created before the transaction is started (ie. via Injection) then it must join the transaction */ 
    entityManager.joinTransaction(); 

    //do stuff  

    entityManager.persist(user); 
    entityManager.flush(); //logs will show an insert at this point 

    userTx.commit(); //or rollback() 
} 

Но если сделка уже идет, и вы хотите присоединиться к нему, то вы используете userTx.isActive() и т.д.

+0

Отличный человек !!! Я мог бы использовать это, чтобы исключить исключение «Транзакция неактивна». – prageeth

Смежные вопросы