EJB CMT TransactionAttributeType.REQUIRES_NEW не работает
-
29-09-2020 - |
Вопрос
@Stateless @LocalBean
public class MySLSB {
@Resource
SessionContext ctx;
@PersistenceContext(unitName = "myPU")
EntityManager em;
public void T1() {
em.persist(new MyEntity(1L)); //T1 created!
/* wrong call to plain java object
T2();
*/
//corrected by lookup its business object first
ctx.getBusinessObject(MySLSB.class).T2();
ctx.setRollbackOnly();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void T2() {
em.persist(new MyEntity(2L)); //T2 created!
}
}
Клиент вызывает T1 (), сначала T2 в качестве новой транзакции должна быть совершена, но T1 будет откат.
Ожидаемый результат:
Т1:вставить в набор myentity id=1;
Т2:вставить в набор myentity id=2;
Т2:совершить;
Т1:откат;
-> В БД создается строка с id=2.
Фактический результат:
вставить в набор myentity id=1;
вставить в набор myentity id=2;
откат;
-> В БД ничего не создается.
В чем проблема?Большое спасибо!
Решение 2
<Сильные> @solution
проблема решена.Я сделал наивную ошибку.
Вызов T2 () должен начать его бизнес-объект, прямой вызов t2 () - просто к его простому объекту Java.
Я обновил код на вопрос выше, заставляя все сработало, как и ожидалось.
Другие советы
Возможно, было бы проще объявить ссылку на себя @EJB MySLSB me;
и позвонить me.T2();
Вместо того, чтобы использовать ctx.getBusinessObject(MySLSB.class)
.Но смысл тот же.