Как насчет закрытия в JavaScript (подобный анонимным методам в C# v2.0 +). Можно создать функцию, которая создает функцию или "выражение".
Пример закрытия :
//Takes a function that filters numbers and calls the function on
//it to build up a list of numbers that satisfy the function.
function filter(filterFunction, numbers)
{
var filteredNumbers = [];
for (var index = 0; index < numbers.length; index++)
{
if (filterFunction(numbers[index]) == true)
{
filteredNumbers.push(numbers[index]);
}
}
return filteredNumbers;
}
//Creates a function (closure) that will remember the value "lowerBound"
//that gets passed in and keep a copy of it.
function buildGreaterThanFunction(lowerBound)
{
return function (numberToCheck) {
return (numberToCheck > lowerBound) ? true : false;
};
}
var numbers = [1, 15, 20, 4, 11, 9, 77, 102, 6];
var greaterThan7 = buildGreaterThanFunction(7);
var greaterThan15 = buildGreaterThanFunction(15);
numbers = filter(greaterThan7, numbers);
alert('Greater Than 7: ' + numbers);
numbers = filter(greaterThan15, numbers);
alert('Greater Than 15: ' + numbers);
Как вы знаете, управление транзакциями - это сквозная задача. Так что не рекомендуется разбросать код по модулям, где эти проблемы не являются их основной заботой.
Если вы используете JTA UserTransaction в среде без EJB, значит, JTA доступен (Apache Tomcat не поддерживает JTA).
Правило 1 °
Управление транзакциями стыков включено по умолчанию для всех запросов JSF (Seam 2.0 +).
Я думаю, что Управление транзакциями швов звучит лучше, чем Транзакции, управляемые швами . Это означает, что Seam за кулисами заботится о вызовах begin и commit. Seam играет роль менеджера транзакций, используя сценарий Seam Transaction Manager
1 ° : POJO + JTA доступен (Apache Tomcat не поддерживает JTA)
Менеджер транзакций, используемый Seam: org. jboss.seam.transaction.UTtransaction
Включено по умолчанию в среде без EJB (война), когда доступен JTA (JBoss поддерживает JTA)
Если вы используете JPA EntityManager или Hibernate Session, вам необходимо зарегистрировать их, чтобы разрешить Seam управлять границами транзакций
См. 9.3. Контексты сохраняемости с управляемым швом как настроить контекст сохраняемости с управляемым швом (вводится с помощью @In)
Затем внедряется EntityManager (EntityManager) или сеанс (Hibernate) с помощью @In (область действия - ScopeType.CONVERSATION)
@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) или сеанс (Hibernate) к активному UserTransaction JTA, вызывая метод joinTransaction
2 ° сценарий : POJO + RESOURCE_LOCAL (Либо Hibernate, либо JPA) Транзакция
Диспетчер транзакций, используемый Seam (JPA): org.jboss. seam.transaction.EntityTransaction
Диспетчер транзакций, используемый Seam (Hibernate): org.jboss.seam.transaction.HibernateTransaction
См. 9.3. Контексты сохраняемости, управляемые швами , как настроить контекст сохраняемости, управляемые швами (вводятся с помощью @In)
За кулисами, диспетчер транзакций швов заботится о вызове begin и commit в базовой технологии с помощью прокси
3 ° сценарий : EJB
Менеджер транзакций, используемый Seam: org.jboss.seam.transaction.CMTTransaction
Включено по умолчанию в среде EJB. Будьте осторожны, в этом случае Seam не контролирует транзакцию, управляемую контейнером.
с уважением,
Контексты сохраняемости, управляемые швами , как настроить контекст сохраняемости, управляемые швами (вводятся с помощью @In)За кулисами, диспетчер транзакций швов заботится о вызове begin и commit в базовой технологии с помощью прокси
3 ° сценарий : EJB
Менеджер транзакций, используемый Seam: org.jboss.seam.transaction.CMTTransaction
Включено по умолчанию в среде EJB. Будьте осторожны, в этом случае Seam не контролирует транзакцию, управляемую контейнером.
с уважением,
Контексты сохраняемости, управляемые швами , как настроить контекст сохраняемости, управляемые швами (внедренные с использованием @In)За кулисами, диспетчер транзакций швов заботится о вызове begin и commit в базовой технологии с помощью прокси
3 ° сценарий : EJB
Менеджер транзакций, используемый Seam: org.jboss.seam.transaction.CMTTransaction
Включено по умолчанию в среде EJB. Будьте осторожны, в этом случае Seam не контролирует транзакцию, управляемую контейнером.
с уважением,
CMTTransactionВключено по умолчанию в среде EJB. Будьте осторожны, в этом случае Seam не контролирует транзакцию, управляемую контейнером.
с уважением,
CMTTransactionВключено по умолчанию в среде EJB. Будьте осторожны, в этом случае Seam не контролирует транзакцию, управляемую контейнером.
с уважением,
В настоящее время я работаю следующим образом:
//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 () и т. Д.