开发者

EJB CMT TransactionAttributeType.REQUIRES_NEW doesn't work

开发者 https://www.devze.com 2023-01-08 16:55 出处:网络
@Stateless@LocalBean public class MySLSB { @Resource SessionContext ctx; @PersistenceContext(unitName = \"myPU\")
    @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!
            }
        }

The client calls T1(), at first T2 as a new Transaction should be committed, but T1 will be rolled back.

Expected result:

T1: insert into myentity set id=1;

T2: insert into myentity set id=2;

T2: commit;

T1开发者_开发问答: rollback;

-> The row with id=2 is created in DB.

Actual result:

insert into myentity set id=1;

insert into myentity set id=2;

rollback;

-> Nothing is created in DB.

What's the problem? Thanks a lot!


It might be easier to declare self reference @EJB MySLSB me; and to call me.T2(); instead of using ctx.getBusinessObject(MySLSB.class). But the sense is the same.


@Solution

The problem is solved. i made a naive mistake.

The call to T2() should lookup its business object, direct call to T2() IS merely to its plain java object.

i updated the code on the question above, making everything worked just as expected.

0

精彩评论

暂无评论...
验证码 换一张
取 消